具有链接的复杂类和CanExecute Relay命令的MVVM属性不起作用

时间:2010-11-25 08:28:01

标签: silverlight mvvm mvvm-light relaycommand canexecute

我在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

一起使用

1 个答案:

答案 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();
 }