只要视图中的任何TextBox发生更改,就可以在视图模型上调用命令

时间:2012-01-20 21:27:25

标签: c# wpf mvvm

我有几个视图,每个视图都有几个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 个答案:

答案 0 :(得分:1)

除此之外,MarkusHütter说你可以保存几行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>