我有几个视图,每个视图都有几个XAML TextBox
个实例。每个的Text属性绑定到一个值对象,该对象表示视图的可视化数据模型。
<TextBox Text="{Binding Path=SelectedItem.SomeValue, UpdateSourceTrigger=PropertyChanged}"/>
我在表格中有大约9或10个这样的盒子。我有一个类(ChangeModel
),用于跟踪哪些表单已被更改(例如,用户已输入新值)。问题是绑定到TextBox.Text
属性的实际值对象(在SelectedItem.SomeValue
示例中)无法访问ChangeModel
。
我想轻松地在XML中添加一个绑定(可能在资源部分中),只要TextBox
发生任何变化,就会在视图模型中调用命令。我想我可以用DataTrigger
声明做到这一点,但我不知道该怎么做。
任何人都可以描述如何使用数据触发器或任何其他XAML机制在视图中的任何TextBox
被更改时提醒视图模型吗?
答案 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>