2

我是 WPF 的新手,来自 WinForms 背景,并且有一个关于绑定与事件处理的相当基本的问题。

为了尝试保持某种责任分离,我有一堆Presentation对象,它们只需要Dependency Properties保存业务对象的 UI 数据部分,业务对象包含相似的数据,但数据类型有时不同,因此Presentation对象是正确的显示目的。所以像

public class MyPresentation
{
   // bunch of dependency properties
   public bool MyProperty
   {
      get { return (bool)GetValue(MyPropertyProperty); }
      set { SetValue(MyPropertyProperty, value); }
   }

   // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
   public static readonly DependencyProperty MyPropertyProperty =
   DependencyProperty.Register("MyProperty", typeof(bool), typeof(MyPresentationObject), new UIPropertyMetadata(false, MyPresentationObject.MyPropertyPropertyChanged));

   MyBusinessObject RelatedBusinessObject { get; set;}

   public MyPresentation(MyBusinessObject businessObejct)
   {
      this.RelatedBusinessObject = businessObject;
   }


   public static void MyPropertyPropertyChanged()
   {
      // Do some stuff to related business objects
   }
}

的属性MyPresentation然后是数据绑定到各种控件,我使用Triggers 等来更改表示依赖属性,这会导致OnPropertyChanged事件中的业务对象更改

我的问题是我是否以正确的方式使用绑定?Binding通常(在 Winforms 中)我会使用点击事件等来更改我的业务对象(或它们的演示版本)的值,但是现在您可以使用、Triggers 和事件,这些事件和那种事件处理似乎是多余的OnPropertyChanged

我错过了什么吗?

4

5 回答 5

1

您以这种方式使用绑定是正确的。还可以查看 Model View View-Model 模式,因为它与您正在做的类似,但更可定义的模板。另请查看接口 INotifyPropertyChanged - 这是一种更可接受的方法,用于捕获属性已在本地更改并通知视图(您的表单)对象已更改。这样您就可以两全其美:对象的更改可能由于单击按钮或绑定而发生。

于 2009-02-03T02:15:19.433 回答
1

看这里,这呈现模式模型视图视图模型,这允许您充分利用 WPF 的绑定和命令,而不会干扰您的业务对象(例如在您的业务对象上实现 INotifyPropertyChanged 之类的 WPF 东西)

于 2009-02-03T08:42:17.733 回答
1

您正在编写不需要编写的额外代码。

首先,如果表示对象只是传递值,您可以直接绑定到业务对象并去掉中间人。

其次,您不需要对表示对象的依赖属性,业务对象的样式和动画只是没有意义,您可以通过为您的属性编写普通的日常设置器来“插入” UI -> 表示对象。

In your example the use of dependency properties only gets you automatic presentation object -> UI updates, as everyone here wrote you can get this with simpler code by using INotifyPropertyChanged.

于 2009-02-03T10:40:59.147 回答
0

我认为您走在正确的轨道上,因为 DependencyProperties 内置了用于处理更改的机制,它们摆脱了额外的事件处理层——它仍然存在,但它内置于 WPF 中。

顺便说一句 - 我相信有人会有一些 MVC 智慧来让一切变得更简单。

于 2009-02-03T01:53:17.013 回答
0

以我的经验,正常模式是简单地使用实现INotifyPropertyChanged的​​表示/业务对象。

很少需要将您的业务/表示对象实现为DependencyObject或附加的DependencyProperties,因为 WPF 中的数据绑定只需要绑定的一侧是DependancyObject(在这种情况下是您的控件) - 另一侧可以,并且在业务对象的情况,通常应该是一个POCO。否则,您最终不得不用 WPF 类不必要地污染您的业务对象。

同样使您的对象DependencyObjects可能是矫枉过正,因为您不会为它们的值设置动画、样式、模板等。

干杯,杰克

于 2009-02-03T05:07:04.233 回答