在类对象的设置器中实现RaiseCanExecuteChanged方法

我仍然不确定我的方法是否正确,但是为了实现MVVM模式,我以以下方式创建了模型类“ Test”:


public class Test : BindableBase

{

    private int testNumber;

    public int TestNumber

    {

        get { return testNumber; }

        set { SetProperty(ref testNumber, value) }

    }

    ...

}

然后,我在我的类中创建了此类的实例ViewModel:


class ViewModel : BindableBase

{

    private Test testVM;

    public Test TestVM

    {

        get { return testVM; }

        set { SetProperty(ref testVM, value); }

    }

    ...

在XAML的代码中,View我Test通过TestVM属性绑定了该类的所有属性。尽管这可以正常工作,但是在尝试实现时遇到了一个问题DelegateCommad。


    public DelegateCommand StartTestCommand { get; private set; }

到目前为止,在实现DelegateCommands时,如果我想CanExecute在属性更改时触发该方法,则可以将其包含DelegateCommand.RaiseCanExecuteChanged()在属性的setter中。像这样:


    ...

    private bool duringTest;

    public bool DuringTest

    {

        get { return duringTest; }

        set

        {

            SetProperty(ref duringTest, value);

            StartTestCommand.RaiseCanExecuteChanged();

        }

    }

    ...

这对于在中声明的属性工作正常ViewModel,但是对这些Test属性使用相同的方法时,它将不再起作用。


    ...

    private Test testVM;

    public Test TestVM

    {

        get { return testVM; }

        set

        {

            SetProperty(ref testVM, value);

            StartTestCommand.RaiseCanExecuteChanged();

        }

    }

}

我希望每次TestVM更改from的属性时,都会调用setter,但是会直接更新模型。


我究竟做错了什么?在中使用Model对象时正确的方法是ViewModel什么?


潇湘沐
浏览 333回答 1
1回答

GCT1015

更改对象的属性值不会更改对象的引用。声明这个public Test TestVM{    get { return testVM; }    set    {        SetProperty(ref testVM, value);        StartTestCommand.RaiseCanExecuteChanged();    }}您基本上是在告诉编译器:TestVM更改对对象的引用(甚至更改为相同的值)时,请更新StartTestCommand的状态。但是很明显,一旦分配了该对象,就不会更改对该对象的引用。如果您希望ViewModel在某些子视图模型的(Test)属性更改时更新父视图模型()中的命令,则可以使用以下PropertyChanged事件:public Test TestVM{    get { return testVM; }    set    {        Test oldValue = testVM;        if (SetProperty(ref testVM, value))        {            if (oldValue != null)            {                oldValue.PropertyChanged -= TestPropertyChanged;            }            if (testVM!= null)            {                testVM.PropertyChanged += TestPropertyChanged;            }        }    }}void TestPropertyChanged(object sender, PropertyChangedEventArgs e){    // filter if necessary    if (e.PropertyName == "...")    {        StartTestCommand.RaiseCanExecuteChanged();    }}
打开App,查看更多内容
随时随地看视频慕课网APP