【问题标题】:Logging value changes in WPF Databinding to a Property将 WPF 数据绑定中的值更改记录到属性
【发布时间】:2011-04-27 09:22:06
【问题描述】:

我有一个关于 WPF 数据绑定通知的问题

我有一个复选框,它双向绑定到内部数据模型的 bool 属性。我想要的是在属性更改时在 UI 中显示值更改消息(比如说 "SomeBoolParameter changes from true => false" )。

我已经在数据模型中实现了 INotificationPropertyChanged 接口,我知道我可以通过在 XAML 中设置 SourceUpdated 来获得通知。

但是,我可以在 SourceUpdated 事件中收到的 EventArgs 是一个 DataTransferEventArgs 对象,我不知道如何从中检索数据模型属性值。

因为,我可以将日志记录代码放在属性设置器中......但肯定是一个丑陋的解决方案。有什么想法吗?

【问题讨论】:

  • 抱歉回复晚了。我希望我的数据模型是一个纯模型对象来存储数据。那是我在将日志记录代码与模型混合时感觉违反了关注点分离

标签: wpf data-binding logging


【解决方案1】:

你为什么说这是一个丑陋的解决方案? 每次更改对象值时都会调用 setter。如果您想遵循适当的 MVVM 架构,那么唯一(且干净)的方法是在 setter 中

【讨论】:

    【解决方案2】:

    据我所知,DataTransferEventArgs 既有属性又有来源。你就不能简单地做这样的事情吗?

    DependencyObject source = args.Source as DependencyObject;
    if(source != null)
       DoSomething(source.GetValue(args.Property));
    

    【讨论】:

    • 非常感谢您的帮助。您的代码部分解决了我的问题。当绑定是文本框时它工作正常。但是对于 Checkbox,它不起作用。似乎 WPF 在调用 SourceUpdatedTrigger 后更新了 IsChecked 属性。调用source.GetValue(args.Property)时,会返回旧值... sigh
    【解决方案3】:

    将您的日志记录代码放在 Setter 上并不难看。您的 setter/getter 应该由某种机制生成,无论是 LInq2SQL、Entity Framework 还是其他风格或 ORM,这意味着您可以调整生成器以将自定义日志记录代码放在所有 setter 上。

    如果你不使用 ORM,而且你应该一直使用它,一个更闪亮的解决方案是使用 Interception,尽管这感觉就像你在请求坦克杀死一只苍蝇。有一篇非常好的文章使用 Unity 2.0 here 进行拦截。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多