2010-02-08 2 views
1

В моем приложении WPF у меня есть текстовое поле и кнопка. Кнопка имеет команду привязки к команде, которая будет что-то делать с текстом.Изменение пользовательского интерфейса из команд - использование привязки команд в WPF

<TextBox x:Name="_textBox"></TextBox> 
<Button Command="{Binding SomeCommand}" 
     CommandParameter="{Binding ElementName=_text, Path=Text}" 
     Content="Trigger SomeCommand" /> 

Теперь я хочу, чтобы нажатие кнопки также очистило TextBox. Каков наилучший способ сделать это? Я вижу два варианта:

Я также могу добавить событие Click на кнопку Button - это очистит текст. Это не кажется мне хорошей идеей, поскольку я бы разложил действие в двух местах, полагаясь на порядок, который они выполняли, чтобы быть правильным.

Опцией, которую я использовал сейчас, является передача всего TextBox вместо свойства TextBox.Text. При этом команда может сначала извлечь текст, использовать его, а затем очистить TextBox. Мои связывании то же самое, но без «Путь»:

<TextBox x:Name="_textBox"></TextBox> 
<Button Command="{Binding SomeCommand}" 
     CommandParameter="{Binding ElementName=_text}" 
     Content="Trigger SomeCommand" /> 

И основных частей моей команды:

public class SomeCommand : ICommand 
{ 
    .... 
    public void Execute(object parameter) 
     var textBox = parameter as TextBox; 
     if (inputTextBox == null) return; 
     DoSomething(textBox.Text); 
     textBox.Clear(); 
    } 
} 

Моя проблема состоит в том, что команда теперь полагается на компонент пользовательского интерфейса, и что пользовательский интерфейс зависит от команды, чтобы на самом деле внести некоторые изменения в нее. Мне не все в порядке с этим. Есть ли способ лучше?

ответ

2

Просьба связывать текст текстового текста с объектом, доступным из тела реализации Command. Сделав эту ссылку, вы можете легко ее очистить от своего ViewModel.

Пример (XAML):

<TextBox x:Name="_textBox" Text={Binding Path=XYZ}></TextBox> 
<Button Command="{Binding SomeCommand}" 
     Content="Trigger SomeCommand" /> 

Пример (C#):

public class SomeCommand : ICommand 
    { 
     .... 

     public void Execute(object parameter) 
     { 
      //...actions... 
      MyViewModelinstance.XYZ = String.Empty; 
     } 
    } 

Пожалуйста, дайте мне окрик, если он работает.

EDIT: вы используете MVVM шаблон проектирования, поэтому оно должно быть очевидно, но я напомню на всякий случай: после изменения XYZ вы должны уведомить UI, что это свойство было изменено. Вы можете сделать это, например, путем внедрения INotifyPropertyChanged Interface вашей виртуальной машиной.

+0

Я использую шаблон MVVM, и кажется, что вы правы. Я бы привязал текстовое поле к некоторому свойству того же ViewModel, которое содержит команду, которая должна очистить его. Я считаю, что это звучит разумно. Завтра будет ближе. Благодаря! – stiank81

+0

Пожалуйста, сделайте, я уверен, что это вам поможет. –

+0

Ты абсолютно прав. Не делал это точно так же, как предлагалось, но по существу я сохраняю значение в ViewModel и заставляю команду использовать значение, хранящееся в ViewModel, а затем очищать его. Благодаря! – stiank81