Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在类对象的setter内实现RaiseCanExecuteChanged方法_C#_Wpf_Mvvm_Prism_Delegatecommand - Fatal编程技术网

C# 在类对象的setter内实现RaiseCanExecuteChanged方法

C# 在类对象的setter内实现RaiseCanExecuteChanged方法,c#,wpf,mvvm,prism,delegatecommand,C#,Wpf,Mvvm,Prism,Delegatecommand,我仍然不确定我的方法是否正确,但在尝试实现MVVM模式时,我以以下方式创建了一个模型类“Test”: public class Test : BindableBase { private int testNumber; public int TestNumber { get { return testNumber; } set { SetProperty(ref testNumber, value) } } ... } 然

我仍然不确定我的方法是否正确,但在尝试实现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代码中,我通过
TestVM
属性绑定
Test
类的所有属性。虽然这很好,但在尝试实现
DelegateCommad
时遇到了问题

    public DelegateCommand StartTestCommand { get; private set; }
到目前为止,在实现
DelegateCommand
s时,如果我想在属性发生更改时触发
CanExecute
方法,我会在属性的setter中包含
DelegateCommand.RaiseCanecuteChanged()
。像这样:

    ...
    private bool duringTest;
    public bool DuringTest
    {
        get { return duringTest; }
        set
        {
            SetProperty(ref duringTest, value);
            StartTestCommand.RaiseCanExecuteChanged();
        }
    }
    ...
这对于
视图模型
中声明的属性很有效,但是当对
测试
属性使用相同的方法时,这将不再有效

    ...
    private Test testVM;
    public Test TestVM
    {
        get { return testVM; }
        set
        {
            SetProperty(ref testVM, value);
            StartTestCommand.RaiseCanExecuteChanged();
        }
    }
}
我希望每次更改
TestVM
中的属性时,都会调用setter,但是直接更新模型


我做错了什么?在
视图模型
中使用
模型
对象时,正确的方法是什么?

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

宣布

public Test TestVM
{
    get { return testVM; }
    set
    {
        SetProperty(ref testVM, value);
        StartTestCommand.RaiseCanExecuteChanged();
    }
}
您基本上是在告诉编译器:当对
TestVM
对象的引用发生更改(甚至更改为相同的值)时,更新
StartTestCommand
的状态

但很明显,一旦指定了对象,就不会更改对该对象的引用

如果要在某些子视图模型(
Test
)属性更改时更新父视图模型(
ViewModel
)中的命令,可以使用
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();
    }
}

请澄清如何在XAML中绑定TestVM属性?它是双向绑定吗?不确定当它的一个属性发生更改时,为什么必须发出
TestVM
通知?是否有任何特定要求>?@AlexRusskov是的,它是双向绑定。@例如,user1672994,每次用户修改TestVM.TestNumber属性时,我都希望运行CanExecute()方法。“当对TestVM对象的引用更改(甚至更改为相同的值)时,更新StartTestCommand的状态”。这意味着,如果我编写了如下内容,就会调用setter:TestVM=newtest();您还应该在
TestVM
setter中保留
starttCommand.raisecancecutchanged()
,否则
TestVM
的初始和后续设置不会使命令无效。@Grx70,这取决于要求。也许,没有必要这么做。但这值得一提,谢谢。