WPF数据绑定是否会让事情变得更加痛苦?

时间:2009-02-20 21:11:14

标签: wpf data-binding

确定, 所以我在最近的非工作项目中陷入困境,试图使用WPF。我对数据绑定非常恼火。我认为通过将数据直接绑定到UI可以使事情更简单。但是我越了解到必须实现INotifyPropertyChanged以便在它们发生变化时通知用户界面,这似乎会使整个过程变得有效。

我错过了什么吗?看起来像是一堆工作并且必须使类实现INotifyPropertyChanged似乎是一种让数据绑定工作的方式。

我错过了什么?我肯定错过了什么。请告诉我如何使数据绑定变得容易,或者至少是直截了当。

8 个答案:

答案 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