当需要该类 WPF 的多个实例时,模型内部的 INotifyPropertyChanged
Posted
技术标签:
【中文标题】当需要该类 WPF 的多个实例时,模型内部的 INotifyPropertyChanged【英文标题】:INotifyPropertyChanged inside a Model when needing multiple instances of that class WPF 【发布时间】: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我倾向于避免在模型中使用 INotifyPropertyChanged,因为我认为最好让视图专门绑定到视图模型。
这取决于您如何定义“模型”。如果它是跨多个应用程序使用的某种域对象,则不应直接绑定它,而应创建一个实现 INotifyPropertyChanged
的包装视图模型类。
这是在模型中使用 INotifyPropertyChanged 的确切场景吗?
当然,只要“模型”不是域对象。然后,您应该在客户端应用程序中将其替换为视图模型。
在这种典型情况下,我应该如何处理这种情况,您需要使用 MVVM 设计模式绑定到 ViewModel 中的集合内的类型的属性?
创建一个实现INotifyPropertyChanged
的“子”视图模型类,并将当前模型对象转换为此类型,例如通过简单的wrapping 属性。
【讨论】:
以上是关于当需要该类 WPF 的多个实例时,模型内部的 INotifyPropertyChanged的主要内容,如果未能解决你的问题,请参考以下文章
WPF 10天修炼 - Application全局应用程序类