TextBox.TextChanged & ICommandSource - PullRequest
       42

TextBox.TextChanged & ICommandSource

10 голосов
/ 11 сентября 2008

Я следую шаблону M-V-VM для моего интерфейса WPF. Я хотел бы подключить команду к событию TextChanged TextBox к команде, которая находится в моем классе ViewModel. Единственный способ, которым я могу представить себе выполнение этой задачи, - это наследовать от элемента управления TextBox и реализовать ICommandSource. Затем я могу дать команду команде сработать из события TextChanged. Это кажется слишком большой работой для чего-то, что кажется таким простым.

Есть ли более простой способ (чем создание подкласса TextBox и реализация ICommandSource) для подключения события TextChanged к моему классу ViewModel?

Ответы [ 3 ]

18 голосов
/ 11 сентября 2008

Прежде всего, вы наверняка рассматривали двустороннюю привязку данных к своей модели представления с помощью UpdateSourceTrigger из PropertyChanged? Таким образом, установщик свойства свойства, к которому вы привязываетесь, будет вызываться при каждом изменении текста?

Если этого недостаточно, я бы решил эту проблему, используя Attached Behaviors. В блоге Джулиана Домингеса вы найдете статью о том, как сделать что-то очень похожее в Silverlight, которое должно быть легко адаптировано к WPF.

По сути, в статическом классе (называемом, скажем, TextBoxBehaviours) вы определяете присоединенное свойство, называемое (возможно) TextChangedCommand типа ICommand. Подключите обработчик OnPropertyChanged для этого свойства, и в обработчике убедитесь, что свойство устанавливается в TextBox; если это так, добавьте обработчик к событию TextChanged в текстовом поле, который будет вызывать команду, указанную в свойстве.

Затем, предполагая, что ваша view-модель была назначена для DataContext вашего View, вы должны использовать его следующим образом:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />
8 голосов
/ 11 сентября 2008

Использование привязки к событию и метода команд может быть неправильным решением. Что именно будет делать эта команда?

Возможно, вы захотите использовать привязку данных к строковому полю в вашей виртуальной машине. Таким образом, вы можете вызывать команду или функцию оттуда, не заботясь об интерфейсе.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}
2 голосов
/ 11 сентября 2008

Не можете ли вы просто обработать событие TextChanged и выполнить команду оттуда?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

Альтернатива, как вы говорите, заключается в создании TextBox, который действует как источник команд, но это выглядит излишним, если вы не планируете делиться им и использовать во многих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...