为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
潇湘沐 2021-05-04 15:49:25
我仍然不确定我的方法是否正确,但是为了实现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什么?
查看完整描述

1 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

更改对象的属性值不会更改对象的引用。


声明这个


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

    }

}


查看完整回答
反对 回复 2021-05-16
  • 1 回答
  • 0 关注
  • 421 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号