【发布时间】:2021-01-02 07:03:54
【问题描述】:
我有一个 ListView,而 ListView 的 ItemTemplate 包含一个 TextBox。 ListView 的ItemSource 是一个T 类型的ObservableCollection,Viewmodel 有一个作为Property 的实例。视图需要将自身绑定到 T 的特定属性。(T 存在于多个属性中)
<ListView ItemSource={Binding SomeObservableCollectionOfTypeT}>
<ListView.ItemTemplate>
<DataTemplate>
<TextBox Text = {Binding T.Someproperty, UpdateSourceTrigger=PropertyChanged} />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
起初我将 T 作为 ViewModel 中的内部类(T 也实现了 INotifyPropertyChanged),但我意识到我需要以相同的方式在多个 ViewModel 中使用这个类。 T 将是这里的模型。
我倾向于避免在模型中使用 INotifyPropertyChanged,因为我认为最好让视图专门绑定到视图模型。 这是在模型中使用 INotifyPropertyChanged 有效的确切场景吗? 在这种典型情况下,我应该如何处理这种情况,您需要使用 MVVM 设计模式绑定到 ViewModel 中的集合内的类型的属性?
【问题讨论】:
-
如果模型是只读的,则不会实现 INPC,否则在其上实现 INPC 接口。为什么需要滚动查看器? ListView 也可以滚动内容。那么如果不想绑定到view,建议怎么展示Model呢?
-
直接绑定到模型属性或向模型中添加某些视图模型特性是一种 惰性 MVVM。可以将其想象为将模型 + 视图模型组合在一个类中。在 SRP 方面可能不太好,但如果视图模型只是像一个简单的包装器一样,则更容易。
-
"如果模型是只读的,则不会实现 INPC,否则在其上实现 INPC 接口。"谢谢。另外我不知道如何实现它。但我听说人们说视图应该专门绑定到视图模型。 (我会编辑掉滚动查看器。)
-
“直接绑定到模型属性或向模型添加某些视图模型特性是一种惰性 MVVM。”。在这个示例中,如果没有惰性 mvvm,您将如何在 somecollection
中公开 T 的属性?
标签: c# wpf mvvm inotifypropertychanged