侦听PropertyChanged事件以获取业务逻辑

时间:2018-09-10 07:24:47

标签: c# mvvm uwp mvvm-light

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

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

为此,我使用INotifyPropertyChanged接口来检测对象中的属性何时更改,或者在子对象中使用PropertyChanged事件进行更改(如果需要)。 当通过双向数据绑定出现更改时,我正在保存整个对象。 诸如此类的东西(代码可能包含错别字,并不代表真实代码):

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();
    }
}

现在,我可以收听我的PropertyChanged的{​​{1}}事件来保存它。 知道ObjectViewModel属性是与MyString双向绑定的。 而且Property1和2是双向绑定到自定义TextBox(某种UserControl)的。

但是我的同事告诉我,RadioButton事件是用于绑定的,将它们附加到业务逻辑上是不好的做法。 然后,他删除了对PropertyChanged的侦听,在UserControl的PropertyChanged事件上添加了一个侦听器,并通过Tapped发送了一些自定义Message。 字符串也一样,更改后他会在其中发送自定义Messenger

我真的不是很喜欢它的修改。

监听Message事件以获取业务逻辑是否是错误的做法?

2 个答案:

答案 0 :(得分:0)

PropertyChanged tapped 都是回调,它们都不是好方法,因此,如果您已经重新构造了它,则完全取决于您如何构造应用程序使用 PropertyChanged 进行操作,然后继续进行操作就不会造成任何伤害。另一方面,点击事件也将同样有效,因此请回答您的特定情况:

“不!对于业务逻辑来说,PropertyChanged并不是一个坏习惯。

答案 1 :(得分:0)

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