Использование «нормального» ICommand - PullRequest
1 голос
/ 06 ноября 2010

Я использовал RelayCommand из MVVM Foundation, теперь, когда я пытаюсь использовать «обычный» ICommand, я не совсем понимаю, как его использовать, в частности, «привязывать» его к переменным, использованным моим основным классом. , Я просто хочу создать OkCommand, которое вызывает событие (RequestClose) в главном классе, модель представления. Кроме того, я хочу включить его, только если все привязки действительны. Проверки осуществляются с использованием ValidationRule, что-то вроде ниже

<TextBox>
    <TextBox.Text>
        <Binding Path="Blue">
            <Binding.ValidationRules>
                <validators:ByteValidator />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

1 Ответ

1 голос
/ 08 ноября 2010

ICommand - это интерфейс, поэтому он по сути абстрактный.Вы не можете использовать это напрямую - вам нужно что-то, что реализует это.(Например, RelayCommand)

WPF предоставляет встроенную реализацию ICommand: RoutedCommand.(И связанный производный тип, RoutedUICommand.) Однако эти типы предназначены для очень специфического сценария, который не соответствует тому, что вы описываете.(Они используют структуру дерева пользовательского интерфейса для определения того, что будет обрабатывать команду. Обычно это подходит только в том случае, если у вас есть несколько различных реализаций какой-либо общей команды, предоставляемой непосредственно элементами управления. Например, TextBox знает, как реализовать Cut, Copy, Pasteи т. д., и вы хотите, чтобы TextBox с фокусом обрабатывал команду.)

Так что на самом деле не существует "нормальной" реализации ICommand.А также, вы, вероятно, не хотите использовать правила проверки ...

Правила проверки довольно ограничены, и очень трудно заставить их поддерживать описанный вами сценарий.У них есть два ограничения:

  1. Они действительно хороши только для полностью автономных правил проверки, которые могут применяться без какого-либо контекста.(Например, «Является ли эта строка десятичным числом?»)
  2. Трудно связать их с чем-либо еще, потому что весь механизм не имеет понятия контекста.

Этот второй делаеттрудно делать то, что ты хочешь.Вот почему они не используются полностью, и, вероятно, именно поэтому Microsoft представила более совершенный механизм - для большинства сценариев проверки вы не используете ValidationRule, а вместо этого заставляете свой источник данных реализовывать IDataErrorInfo.

Принцип заключается в том, что именно ваш объект источника данных решает, действителен он или нет.И ваш объект источника данных может также изменить действительность любых команд.Вот как вы бы организовали отключение объекта OkCommand, когда элементы недопустимы.

И поскольку WPF не предоставляет простую встроенную реализацию ICommand, подходящую для этого сценария, именно поэтому люди чувствуют необходимостьнапишите такие вещи, как RelayCommand.Это ответ на тот факт, что WPF на самом деле не имеет встроенной «нормальной» команды - у него есть только фанки перенаправленных команд.

...