实际上,我觉得布尔类型的附加属性解决方案有点不太干净和笨拙,因为你必须找到一个方法来确保你的视图模型属性的下一个设置确实会引发附加属性更改事件。
一个简单而更优雅的解决方案是,将你的行为绑定到属性类型上,你可以确定下一个值总是与之前不同,从而确保你的附加属性更改事件每次都会被引发。
最简单的类型是整数。因此,解决方案通常是以下组合:
该行为:
public static class TextBoxFocusBehavior
{
public static int GetKeepFocus(DependencyObject obj)
{
return (int)obj.GetValue(KeepFocusProperty);
}
public static void SetKeepFocus(DependencyObject obj, int value)
{
obj.SetValue(KeepFocusProperty, value);
}
public static readonly DependencyProperty KeepFocusProperty =
DependencyProperty.RegisterAttached("KeepFocus", typeof(int), typeof(TextBoxFocusBehavior), new UIPropertyMetadata(0, OnKeepFocusChanged));
private static void OnKeepFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBox t = d as TextBox;
if (t != null)
{
t.Focus();
}
}
}
视图模型属性:
public int InputFocus
{
get { return _inputFocus; }
private set
{
_inputFocus = value;
Notify(Npcea.InputFocus);
}
}
使用附加行为的方法:
<TextBox v:TextBoxFocusBehavior.KeepFocus="{Binding InputFocus}"/>
最后在虚拟机中使用该属性:
public void YouMethod()
{
InputFocus++;
}
一些非常恶意的人可能会说这个逻辑受到 int32 大小限制的约束。嗯... 我现在选择忽略他们;-)