扩展具有MVVM的IsSelected属性的外部对象?

时间:2018-08-23 08:43:14

标签: c# wpf inheritance mvvm properties

我必须创建一个基于WPF / MVVM的小型GUI,向用户显示从外部库中获取的对象列表。用户不能直接编辑这些对象,而只能选择它们以供进一步使用。 起初我可以直接在常规集合中使用给定的对象,因为我看不到需要INotifyPropertyChanged实现,但是后来我注意到我需要一个IsSelected属性,以便视图模型可以知道由哪个对象选择了用户,而且还有一种情况,我必须从视图模型中选择特定的对象。这意味着我必须以某种方式添加上述IsSelected属性,以使此方案在MVVM中工作。

我有什么选择?

我是否需要编写一个包装类,该包装类从外部类继承并仅通过所述IsSelected属性对其进行扩展?这意味着我还必须转换从外部库中获得的对象列表,然后才能使用它们。

或者是否有更方便的方法来扩展外部对象,以便我可以基于MVVM的方式处理选择?

1 个答案:

答案 0 :(得分:1)

您可以在视图模型上定义所选对象的集合,例如:

public class YourViewModel
{
    public List<Thing> SelectedThings { get; } = new List<Thing>();
}

由于内置WPF ListBox的SelectedItems属性不是DependencyProperty,因此无法绑定,因此可以使用

这样的简单事件处理程序来管理集合。
<ListBox SelectionChanged="ListBox_SelectionChanged" />

在代码背后:

private YourViewModel vm;

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    foreach (var item in e.AddedItems)
    {
        vm.SelectedThings.Add(item);
    }
    foreach (var item in e.RemovedItems)
    {
        vm.SelectedThings.Remove(item);
    }
}

如果您也想设置视图模型中的选定项目,那么我在这里找到了一个不错的解决方案,而不是事件处理程序:https://www.tyrrrz.me/Blog/WPF-ListBox-SelectedItems-TwoWay-binding