似乎是一个简单的问题使我困惑了一段时间,所以我很乐意提供一些建议。
我需要实现在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)。非常感谢。