Вызывать команду для модели представления всякий раз, когда какой-либо TextBox в представлении изменяется - PullRequest
1 голос
/ 21 января 2012

У меня есть несколько представлений, каждый из которых имеет несколько экземпляров XAML TextBox.Свойство Text каждого из них связано с объектом-значением, представляющим визуальную модель данных для представления.

<TextBox Text="{Binding Path=SelectedItem.SomeValue, UpdateSourceTrigger=PropertyChanged}"/>

У меня около 9 или 10 таких полей в форме.У меня есть класс (ChangeModel), который отслеживает, какие формы были изменены (например, пользователь ввел новое значение).Проблема заключается в том, что объект фактического значения, связанный со свойством TextBox.Text (в примере, который будет SelectedItem.SomeValue), не может получить доступ к ChangeModel.

Я хотел бы легко добавитьсвязывание в XML (возможно, в разделе ресурсов), которое будет вызывать команду в модели представления всякий раз, когда изменяется TextBox.Я думаю, что могу сделать это с помощью оператора DataTrigger, но я не уверен, как это сделать.

Может кто-нибудь описать, как использовать триггер данных или любой другой механизм XAML для предупреждения модели представления всякий раз, когдалюбой TextBox в пределах этого представления изменяется?

1 Ответ

1 голос
/ 21 января 2012

В дополнение к этому Маркус Хюттер сказал, что вы можете сохранить несколько строк XAML и написать собственное поведение, подобное этому

public class InvokeCommandOnTextChanged : Behavior<TextBox>
{
    public static DependencyProperty CommandProperty =
        DependencyProperty.Register("Command", typeof(ICommand), typeof(InvokeCommandOnTextChanged));

    public static DependencyProperty CommandParameterProperty =
        DependencyProperty.Register("CommandParameter", typeof(object), typeof(InvokeCommandOnTextChanged));

    public ICommand Command
    {
        get { return (ICommand)GetValue(CommandProperty); }
        set { SetValue(CommandProperty, value); }
    }

    public object CommandParameter
    {
        get { return GetValue(CommandParameterProperty); }
        set { SetValue(CommandParameterProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        this.AssociatedObject.TextChanged += OnTextChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        this.AssociatedObject.TextChanged -= OnTextChanged;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        var command = this.Command;
        var param = this.CommandParameter;

        if (command != null && command.CanExecute(param))
        {
            command.Execute(param);
        }
    }
}

Тогда вы можете использовать это поведение со своими текстовыми полями:

<TextBox>
    <i:Interaction.Behaviors>
        <b:InvokeCommandOnTextChanged Command="{Binding AddCommand}" />
    </i:Interaction.Behaviors>
</TextBox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...