确定, 所以我在最近的非工作项目中陷入困境,试图使用WPF。我对数据绑定非常恼火。我认为通过将数据直接绑定到UI可以使事情更简单。但是我越了解到必须实现INotifyPropertyChanged以便在它们发生变化时通知用户界面,这似乎会使整个过程变得有效。
我错过了什么吗?看起来像是一堆工作并且必须使类实现INotifyPropertyChanged似乎是一种让数据绑定工作的方式。
我错过了什么?我肯定错过了什么。请告诉我如何使数据绑定变得容易,或者至少是直截了当。
答案 0 :(得分:4)
如果您希望在基础数据源发生更改时通知UI,则需要某种类型的通知机制。对于WPF,INotifyPropertyChanged就是那种机制。
在Windows窗体中也是如此,但Windows窗体也支持旧的通知机制,其中有一个名为<Property>Changed
的事件。
但是,如果您只想绑定数据并显示它们,这些机制都不需要这些机制。
如果您没有收到通知,那么只需绑定到数据源即可。
答案 1 :(得分:4)
说实话,我没有看到它那么糟糕,并认为这是一个非常可行的解决方案。
采用这个简单的数据模型对象:
Public Class SimpleItemViewModel
Implements INotifyPropertyChanged
Private _item As String
Public Property Item As String
Get
return _item
End Get
Set (value as string)
_item = value : OnPropertyChanged("Item")
End Set
End Property
Protected Overridable Sub OnPropertyChanged(propChange as string)
Raise Event PropertChanged(me, new PropertyChangedEventArgs(propChange))
End Sub
Public Event PropertyChanged(sender as object, e as PropertyChangedEventArgs)
End Class
通过以下方式轻松绑定到简单的文本框:
<Textbox Text="{Binding Item}" />
另外,如果我想要一个DIRTY标志,我可以轻松地将标志设置在OnPropertyChanged子集中,并轻松确定是否需要保存任何用户更改。
我发现最简单的方法是在数据访问层和拥有这些内容的UI之间放置一组类。您甚至可以让您的业务逻辑和DAL通过这些类而不是原子值。
答案 2 :(得分:2)
实施INotifyProperty
改变并不是特别困难,因为它只有一个成员。
如果您不希望更改基础对象,则不必担心INotifyProperty
已更改,并使用绑定Mode=OneTime
。
如果底层对象可以更改并且您希望GUI反映这些更改,那么如果没有INotifyProperty
更改提供的通知,如何实现这一目标呢?期望绑定项目轮询其绑定源是不合理的。
就我个人而言,我发现WPF已经花了一些时间来掌握,但现在我感到很舒服,我发现它非常强大和令人愉快。我鼓励那些发现WPF挑战的人坚持下去。
答案 3 :(得分:1)
XAML中的绑定非常简单,但代码中的动态WPF数据绑定很痛苦且令人困惑。
答案 4 :(得分:0)
DataBinding是在WPF / Silverlight中实现模型视图模式的唯一方法。通过实现INotifyPropertyChanged,您的模型可能是UI愚蠢的,它将它们与UI隔离开来。在将信息填充到UI中时,它还可以节省大量的UI代码。
我喜欢的另一个好处是能够使用{Binding}快捷方式使用相同的数据进一步绑定子控件。
答案 5 :(得分:0)
首先,INotifyPropertyChanged不是使数据绑定工作的唯一方法 - 依赖属性也可以工作。
其次,INotifyPropertyChanged可以在实体类中使用一行代码实现,如果你使用AOP - 你实际上不必自己做所有这些通知调用。
总的来说,我认为数据绑定是一个很好的选择,特别是当您进行代码生成以从某些数据源自动绑定控件时。
答案 6 :(得分:0)
如果您正在寻找一种考虑构建数据绑定的好方法,那么只需在逻辑树上设置一次DataContext,然后使用绑定路径填充UI的各个部分。
答案 7 :(得分:0)
在绑定中尽可能具有声明性。让模板系统完成它的工作并大量使用指定显式DataTemplate
s的DataType
。