如何实现WPF的可选列表

似乎是一个简单的问题使我困惑了一段时间,所以我很乐意提供一些建议。

我需要实现在WPF中使用的可选列表。由于列表可能很长,并且用户通常只会选择很少的项目,因此我认为最好的方法是只获取一次完整的列表,然后仅获取每个主要对象(MyParent)实例的选定对象列表。 MyParent也可以被实例化很多次,并且用户通常一次可以处理多个实例。我希望用户能够看到包含可能项目的整个列表,并能够选择他们想要的东西。我不确定如何绑定这些属性

我的代码(简体和通用名称):

// item model:
public class MyItem
{
    public int ItemId { get; set; }
    public string ItemName { get; set; }
    public bool IsSelected { get; set; } = false;
}

// items factory (ideally entire list should only be
// pulled once in a program lifetime hence singleton):
public class MyItemsFactory
{
    private ObservableCollection<MyItem> myItems => new ObservableCollection<MyItem>();
    public static ObservableCollection<MyItem> MyItems => Instance.myItems;

    private MyItemsFactory()
    {
        GetItems();
    }
    private void GetItems()
    {
        // generate some sample data
        var i1 = new MyItem() { ItemId = 1,ItemName = "Item 1" };
        var i2 = new MyItem() { ItemId = 2,ItemName = "Item 2" };
        var i3 = new MyItem() { ItemId = 3,ItemName = "Item 3" };
        var i4 = new MyItem() { ItemId = 4,ItemName = "Item 4" };
        myItems.Add(i1);
        myItems.Add(i2);
        myItems.Add(i3);
        myItems.Add(i4);
    }

    #region Singleton Implementation
    private static readonly Lazy<MyItemsFactory> instance = new Lazy<MyItemsFactory>(() => new MyItemsFactory());
    public static MyItemsFactory Instance => instance.Value;
    #endregion
}

// parent class
public class MyParent
{
    public int ParentId { get; set; }
    public ObservableCollection<MyItem> MySelectedItems { get; set; } = new ObservableCollection<MyItem>();
    public MyParent()
    {
        GetSelectedItems();
    }
    private void GetSelectedItems()
    {
        // generate some sample data
        var si2 = new MyItem() { ItemId = 2,ItemName = "Item 2",IsSelected = true };
        var si4 = new MyItem() { ItemId = 4,ItemName = "Item 4",IsSelected = true };
        MySelectedItems.Add(si2);
        MySelectedItems.Add(si4);
        // how to include remaining MyItemsFactory.MyItems here?
    }
}

我的UserControl:

<!-- DataContext is set to one of the instance of MyParent -->
<ListView ItemsSource="{Binding MySelectedItems}">
    <ListView.View>
        <GridView>
            <gridviewcolumn Header="Selected">
                <gridviewcolumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton
                            IsChecked="{Binding IsSelected}"
                            Content="Selected"/>
                    </DataTemplate>
                </gridviewcolumn.CellTemplate>
            </gridviewcolumn>
            <gridviewcolumn Header="Item Name">
                <gridviewcolumn.CellTemplate>
                    <DataTemplate>
                        <ToggleButton Content="Selected"
                                        IsChecked="{Binding IsSelected}"
                                        Command="{x:Static c:CommandManager.SelectItem}"
                                        commandparameter="{Binding}"/>
                    </DataTemplate>
                </gridviewcolumn.CellTemplate>
            </gridviewcolumn>
        </GridView>
    </ListView.View>
</ListView>

这很好用,但是当然只显示MySelectedItems。我的意图是根据MyParent实例的MySelectedItems显示所有具有选定项目的项目(例如,来自MyItemsFactory.MyItems)。非常感谢。

rus_test 回答:如何实现WPF的可选列表

公开 EightWeekGamePlan.aggregate( [ { $sort: { SupplierGeneralId: 1 } },{ $group: { _id: { SupplierGeneralId: "$SupplierGeneralId",month: { $month: "$InsertDate" },year: { $year: "$InsertDate" } },LeadsUploaded: { $push: { LeadId: "$LeadId" } },Sells: { $sum: "$TotalClaimsLeftToBeClaimedByClientType" } } },{ $project: { Sells: "$Sells",LeadsUploaded: { $reduce: { input: { $setUnion: "$LeadsUploaded.LeadId" },initialValue: [],in: { $concatArrays: [ "$$value",[ { Lead_ID: "$$this" } ] ] } } } } } ] 中所有项目的单例集:

MyParent

ListView然后可以绑定到该属性:

public class MyParent
{
    public MyItems 
    {
        get
        {
            return MyItemsFactory.MyItems;
        }
    }
}
本文链接:https://www.f2er.com/2832588.html

大家都在问