На самом деле, я нашел решение с булевыми вложенными свойствами немного грязным и неуклюжим в том смысле, что вам нужно найти поворот, чтобы быть уверенным, что следующий набор вашего свойства модели представления действительно вызовет событие изменения присоединенного свойства.
Простое и более элегантное решение - связать ваше поведение с типом свойства, для которого вы можете быть уверены, что следующее значение всегда будет отличаться от предыдущего, и, таким образом, быть уверенным, что событие изменения присоединенного свойства будет вызываться каждый раз.
Самый простой тип, который приходит на ум, это int. Решение тогда - обычная комбинация:
Поведение:
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);
}
// Using a DependencyProperty as the backing store for KeepFocus. This enables animation, styling, binding, etc...
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()
{
//some code logic
InputFocus++;//<= the textbox focus
}
Некоторые ДЕЙСТВИТЕЛЬНО злые духи могут сказать, что эта логика связана с ограничением размера int32. Ну ... я сейчас просто проигнорирую их; -)