Wpf 在MVVM应用程序的ViewModel中将新字段添加到模型集合中的最佳方法是什么?

Wpf 在MVVM应用程序的ViewModel中将新字段添加到模型集合中的最佳方法是什么?,wpf,mvvm,collections,binding,Wpf,Mvvm,Collections,Binding,我正在使用MVVM Light编写具有MVVM结构的WPF应用程序。 我在模型中有classFoo: class Foo: ObservableObject { private string _propA = String.Empty; public string PropA { get => _propA ; set { if (_propA == value) {

我正在使用MVVM Light编写具有MVVM结构的WPF应用程序。 我在模型中有class
Foo

class Foo: ObservableObject
{
    private string _propA = String.Empty;
    public string PropA
    {
        get => _propA ;

        set
        {
            if (_propA == value)
            {
                return;
            }

            _propA = value;
            RaisePropertyChanged("PropA");
        }
    }

    // same for property PropB, PropC, PropD, etc.
}
class FooCollection: ObservableObject
{
    private ObservableCollection<Foo> _items = null;
    public IEnumerable<Foo> Items 
    {
        get { ... }
        set { ... }
    } 

    public string Name { get; set; }

    // ...
    // and other methods, properties and fields
}
我在模型中收集了一些
Foo
对象:

class Foo: ObservableObject
{
    private string _propA = String.Empty;
    public string PropA
    {
        get => _propA ;

        set
        {
            if (_propA == value)
            {
                return;
            }

            _propA = value;
            RaisePropertyChanged("PropA");
        }
    }

    // same for property PropB, PropC, PropD, etc.
}
class FooCollection: ObservableObject
{
    private ObservableCollection<Foo> _items = null;
    public IEnumerable<Foo> Items 
    {
        get { ... }
        set { ... }
    } 

    public string Name { get; set; }

    // ...
    // and other methods, properties and fields
}
以及以
MainWindowModel
作为数据上下文的视图:

<TextBlock Text={Binding FooList.Name} />
<ItemsControl ItemsSource="{Binding FooList.Items}">
     <ItemsControl.ItemTemplate>
         <DataTemplate>
             <TextBlock Text={Binding PropA} />
             <Button Content={Binding PropB} />
             <!-- other controls with bindings -->
         </DataTemplate>
     </ItemsControl.ItemTemplate>
</ItemsControl>

我在类中没有要绑定的字段
IsChecked
,我不想将它添加到类中,因为它只是接口,而不是数据模型字段。例如,我如何才能创建另一个布尔集合,并将其与
愚人项目一起绑定到此
ItemControl

我不确定是否理解为什么需要在模型中添加属性

您不能只使用command属性或向切换按钮添加EventTrigger吗? (两个例子见世嘉和阿森尼答案)

这样,当您选中toggleButton时,viewModel中有一个方法可以启用或禁用Winform控件的可见性属性

要通过viewModel中的命令更改控件的可见性,可以使用MVVM LIGHT的messenger功能


ViewModel向您的Windows窗体发送一条消息,该消息处理控件的可见性。

添加属性的最佳位置当然是在
Foo
类中

创建另一个其他类型的集合,将当前集合中的每个
Foo
对象添加到这个集合中,然后绑定到这个新对象的某些属性,与简单地向当前类添加属性相比,这似乎是一个非常糟糕的解决方案


Foo
不是一个“接口事物”,或者至少不应该是。应该是视图模型包含视图绑定到的属性。向其添加
IsChecked
属性没有问题。这听起来确实是您的最佳解决方案。

当然,当用户单击ToggleButton时,我可以附加一个事件处理程序或命令,或任何可启用的工具,但这并不能解决问题:ViewModel没有绑定到toggle button的属性。问题是如何在集合中添加一个新字段,我可以在不接触模型类本身的情况下将新用户控件绑定到该字段。要绑定到的IsChecked属性定义在哪里…?如何在WinForms控件中绑定/填充
傻瓜。Items
?@SeeSharpCode我不绑定它。WinForms控件是旧的3D可视化控件(VTK)。@mm8这就是问题所在。如果我不能在
Foo
类中定义它,我应该在哪里定义它以及如何绑定它。您应该在Foo类中定义它。看看我的答案。Foo不应该被视为“接口事物”。这是您的问题。我认为问题在于向模型类添加视图特定的属性。我不认为
Foo
是一个视图模型。它是/应该是一个视图模型。直接绑定到域对象并不经常有用。Foo不是接口<代码>可见
属性是接口的东西。这就是为什么我不想在模型类中添加纯接口属性;Foo不应该是一个模型类。它是具有视图绑定到的属性的视图模型。您通常不会绑定到没有“接口”属性的域对象。这是您的问题。@mm8您是否建议创建一些具有“interface”属性的域对象包装器?