C# 在类对象的setter内实现RaiseCanExecuteChanged方法
我仍然不确定我的方法是否正确,但在尝试实现MVVM模式时,我以以下方式创建了一个模型类“Test”: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) } } ... } 然
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,这取决于要求。也许,没有必要这么做。但这值得一提,谢谢。