Свойство MVVM со связанным сложным классом и командой CanExecute Relay не работает

У меня есть класс сущностей в классе библиотеки С# и связан с библиотекой классов Silverlight (сущности должны быть в классе С# из-за устаревшей совместимости с другими системами)

Пример (библиотека С#):

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 зависит от TestValue в TestClass...

    PressCommand = new RelayCommand(() =>
    {
        DoSomething();
    }, () => TestProp.TestValue != string.empty);

Однако, если TestValue изменено (отличается от пустой строки), PressCommand CanExecute, похоже, не замечает изменения и не включается, что делает его непригодным для использования...

Можно ли использовать CanExecute с таким set-tu?


person KolarJ    schedule 25.11.2010    source источник


Ответы (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();
 }
person aqwert    schedule 25.11.2010
comment
Спасибо! Ваша душа / прогулка отлично работает! Кстати, GalaSoft MVVM - это RaiseCanexecuteChanged(), а не CanExecuteChanged(), это плохо, извините, если кто-то читает... - person KolarJ; 02.12.2010
comment
Есть одна проблема с этим решением. Это не работает с элементом управления NumericUpDown из Silverlight Toolkit... Кажется, значение элемента управления NumericUpDown обновляется после выполнения проверки. - person KolarJ; 02.12.2010
comment
@KolarJ Возможно, задайте еще один вопрос о NumericUpDown, поскольку я не так много играл с ним. - person aqwert; 02.12.2010