我在C#库类中有一个实体类,并链接到Silverlight类库 (实体必须在C#类中,因为与其他系统具有传统的兼容性)
示例(C#库):
public class TestClass
{
private string _testValue;
public string TestValue
{
get { return _testValue; }
set
{
if (_testValue!= value)
{
_testValue = value;
OnPropertyChanged("TestValue");
}
}
}}
此类链接到Silverlight类库。
在MVVM上有一个属性
private TestClass _testProp = new TestClass();
public TestClass TestProp
{
get
{
return _testProp ;
}
set
{
if (value != _testProp )
{
_testProp = value;
RaisePropertyChanged("TestProp");
PressCommand.CanExecuteChanged();
}
}
}
该属性绑定到XAML中的控件
<TextBox Text="{Binding TestProp.TestValue, Mode=TwoWay}">
<Button Content="Press" Command="{Binding PressCommand}" />
我想用RelayCommands控制按钮,CanExecute依赖于TestClass中的TestValue ...
PressCommand = new RelayCommand(() =>
{
DoSomething();
}, () => TestProp.TestValue != string.empty);
但是,如果更改了TestValue(不同于空字符串),PressCommand CanExecute似乎没有注意到更改并且未启用,使其无法使用...
是否可以将CanExecute与这种set-tu
一起使用答案 0 :(得分:1)
您需要做的是在值更改时调用PressCommand.CanExecuteChanged()
。要做到这一点,请仔细聆听属性中值的属性更改
VM
public TestClass TestProp
{
get
{
return _testProp ;
}
set
{
if (value != _testProp )
{
if(_testProp != null)
{
_testProp.PropertyChanged -= TestPropChanged;
}
_testProp = value;
if(_testProp != null)
{
_testProp.PropertyChanged += TestPropChanged;
}
RaisePropertyChanged("TestProp");
PressCommand.CanExecuteChanged();
}
}
}
private void TestPropChanged(object sender, PropertyChangedEventArgs e)
{
//Can check for specific property if required...
PressCommand.CanExecuteChanged();
}