【问题标题】:Listening to PropertyChanged events for business logic监听业务逻辑的 PropertyChanged 事件
【发布时间】:2019-02-14 14:26:57
【问题描述】:

我的问题可能是主观的,如果是,我很抱歉。

我们正在开发一个具有自动保存功能的 UWP 应用程序,这样每次用户更新某些内容时,整个对象都会保存到文件系统中。

为了做到这一点,我使用INotifyPropertyChanged 接口来检测我的对象中的属性何时发生更改,或者在需要时使用PropertyChanged 事件在子对象中进行更改。 当通过 2 路数据绑定出现更改时,我正在保存整个对象。 类似的东西(代码可能包含拼写错误,不代表真实代码):

public class ObjectViewModel : ViewModelBase // from MVVM-Light
{
    public ObjectViewModel()
    {
        Section1 = new SectionViewModel();
        Section1.PropertyChanged += SectionOnPropertyChanged();
        Section2 = new SectionViewModel();
        Section2.PropertyChanged += SectionOnPropertyChanged();
    }

    public SectionViewModel Section1 { get; set; }

    public SectionViewModel Section2 { get; set; }

    private void SectionOnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        RaisePropertyChanged();
    }
}

public class SectionViewModel : ViewModelBase // from MVVM-Light
{
    private string _myString;
    public SectionViewModel()
    {
        Property1 = new SubPropertyViewModel();
        Property1.PropertyChanged += SubPropertyOnPropertyChanged();
        Property2 = new SubPropertyViewModel();
        Property2.PropertyChanged += SubPropertyOnPropertyChanged();
        MyString = "some value";
    }

    public string MyString
    {
        get => _myString;
        set => Set(ref _myString, value);
    }

    public SubPropertyViewModel Property1 { get; set; }

    public SubPropertyViewModel Property2 { get; set; }

    private void SectionOnPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        RaisePropertyChanged();
    }
}

现在我可以收听我的ObjectViewModelPropertyChanged 事件来保存它。 知道MyString 属性是双向绑定到TextBox。 并且 Property1 和 2 是双向绑定到自定义 UserControl(某种 RadioButton)的。

但是我的同事告诉我,PropertyChanged 事件用于绑定,附加到它们以执行业务逻辑是不好的做法。 他删除了对PropertyChanged 的监听,为UserControl 添加了Tapped 事件的监听器,并通过Messenger 发送了一些自定义Message。 字符串也是如此,他在更改时发送自定义Message

我真的不喜欢它的修改。

收听PropertyChanged 事件以获取业务逻辑是一种不好的做法吗?

【问题讨论】:

  • 我认为收听PropertyChanged 比收听Tapped 事件更有效。这听起来像是一个可怕的解决方案。

标签: c# mvvm uwp mvvm-light


【解决方案1】:

在我看来,如果您熟悉 MVVM,您应该使用 ViewModel 中定义的命令来响应用户操作,并在模型层描述您的业务逻辑。绑定和“PropertyChangedEvent”中使用的属性不应包含任何业务逻辑,因为它可能会在未来减慢您的开发过程,通过变成“意大利面条代码”,因为您将添加更多功能并且您将很难调查属性之间的依赖关系。

【讨论】:

    【解决方案2】:

    PropertyChangedtapped 都是回调,它们都不是好的或坏的做法,所以这完全取决于你如何构建你的应用程序,如果你已经使用 PropertyChanged 进行操作,然后继续使用它没有任何害处。另一方面,点击事件也同样有效,因此请回答您的具体情况:

    “NO!PropertyChanged 用于业务逻辑是不错的做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-21
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多