WPF绑定与事件处理

时间:2009-02-03 01:38:04

标签: c# wpf binding event-handling

我是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的属性然后是绑定到各种控件的数据,我使用Trigger等来更改表示依赖项属性,这会导致OnPropertyChanged事件中的业务对象更改

我的问题是我是否以正确的方式使用绑定?通常(在Winforms中)我已经使用了点击事件等来改变我的业务对象(或它们的演示版本)值,但是那些事件和那种事件处理似乎是多余的,因为你可以使用BindingTriggerOnPropertyChanged事件。

我错过了什么吗?

5 个答案:

答案 0 :(得分:1)

以这种方式使用绑定是正确的。还可以查看模型视图视图 - 模型模式,因为它类似于您正在执行的操作,但是更可定义的模板。 还要检查接口INotifyPropertyChanged - 这是一种更可接受的捕获方法,即在本地更改属性并通知视图(表单)对象已更改。这样你就可以获得两全其美的效果:对象的更改可能会因按钮单击或绑定而发生。

答案 1 :(得分:1)

Look here这提供了模型视图ViewModel模式,这允许您充分利用绑定和WPF命令,而不会干扰您的业务对象(比如在您的业务对象上实现像INTifyPropertyChanged这样的WPF内容)< / p>

答案 2 :(得分:1)

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

首先,如果表示对象只传递了值,则可以直接绑定到业务对象并删除中间人。

其次,您不需要在表示对象上使用依赖项属性,业务对象上的样式和动画就没有意义,您可以“插入”UI - &gt;演示文稿对象只需为您的属性编写正常的日常设置器。

在您的示例中,依赖项属性的使用仅为您提供自动演示文稿对象 - &gt; UI更新,正如大家写的那样,你可以通过使用INotifyPropertyChanged来获得更简单的代码。

答案 3 :(得分:0)

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

BTW - 我相信有人会拥有一些MVC的智慧,让一切变得更加简单。

答案 4 :(得分:0)

根据我的经验,正常模式是简单地使用实现 INotifyPropertyChanged 的演示文稿/业务对象。

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

同样使你的对象 DependencyObjects 可能有点过分,因为你不会动画,造型,模板化他们的价值等。

干杯, 千斤顶