Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否使用MVVM的IsSelected属性扩展外部对象?_C#_Wpf_Inheritance_Mvvm_Properties - Fatal编程技术网

C# 是否使用MVVM的IsSelected属性扩展外部对象?

C# 是否使用MVVM的IsSelected属性扩展外部对象?,c#,wpf,inheritance,mvvm,properties,C#,Wpf,Inheritance,Mvvm,Properties,我必须创建一个基于WPF/MVVM的小型GUI,向用户显示我从外部库获得的对象列表。用户不能直接编辑这些对象,只能选择它们以供进一步使用。 起初我认为我可以直接在常规集合中使用给定的对象,因为我认为没有必要使用INotifyPropertyChanged实现,但是后来我注意到,我需要一个IsSelected属性,以便视图模型知道用户选择了哪些对象,而且还有一种情况,我必须从视图模型中选择特定对象。这意味着我必须以某种方式添加所述IsSelected属性,以使该场景在MVVM中工作 我有什么选择

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

我有什么选择

我是否必须编写一个从外部类继承并仅通过所述IsSelected属性对其进行扩展的包装器类?这意味着在使用外部库之前,我还必须转换从外部库获取的对象列表


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

您可以在viewmodel上定义所选对象的集合,如:

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

如果您也想从视图模型设置所选项目,我在这里找到了一个很好的解决方案,而不是事件处理程序:

当您将支持多个选择的控件(例如列表框)绑定到对象集合时,您甚至可能不需要IsSelected属性。ListBox具有SelectedItems属性,该属性包含当前选定的源集合中的所有项。将SelectionMode设置为Multiple或Extended。“更方便的方法”是创建一个新的分部类,该分部类仅添加IsSelected属性,但这将要求您在与原始类型相同的命名空间和程序集中定义该类。如果你不能做到这一点,创建一个包装类实际上是一个不错的选择。绑定到非客户端感知的域对象很少是一个好主意。你是对的。我从很久以前就没有使用过默认的WPF列表框。。。我在这里找到了一个解决办法:或者看看这个:不幸的是,克莱门斯没有写答案,只写了一条评论。然而,他给我指出了正确的方向:使用ListView的SelectedItems属性。我很快注意到这个属性在XAML中默认不可用,但是有很多解决方案使用代码隐藏甚至纯MVVM。我决定这样做:
<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);
    }
}