Изменение пользовательского интерфейса из команд - использование привязки команд в WPF - PullRequest
1 голос
/ 08 февраля 2010

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

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

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

1 Ответ

2 голосов
/ 08 февраля 2010

Пожалуйста, рассмотрите возможность привязки текста Textbox к свойству, доступному в теле реализации 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;
        }
    }

Пожалуйста, напишите мне, если это сработает.

РЕДАКТИРОВАТЬ: вы используете шаблон проектирования MVVM, поэтому он должен быть очевиден, но я напомню на всякий случай: после изменения XYZ вы должны уведомить UI, что это свойство было изменено. Вы можете сделать это, например, реализовав интерфейс INotifyPropertyChanged вашей виртуальной машиной.

...