我是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中)我已经使用了点击事件等来改变我的业务对象(或它们的演示版本)值,但是那些事件和那种事件处理似乎是多余的,因为你可以使用Binding
,Trigger
和OnPropertyChanged
事件。
我错过了什么吗?
答案 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 可能有点过分,因为你不会动画,造型,模板化他们的价值等。
干杯, 千斤顶