Предположим, что у нас есть простой пользовательский интерфейс, который имеет только одну переменную состояния. Это состояние выражается как значение перечисления, например. Phase1, Phase2 и т. д. В зависимости от того, в каком состоянии (фазе) находится пользовательский интерфейс, различные элементы пользовательского интерфейса, окна должны быть видимыми или скрытыми.
Вот код:
public enum Phases { Phase1, Phase2, Phase3 }
public class UIStateModel : DependencyObject
{
public static DependencyProperty CurrentStateProperty =
DependencyProperty.Register("CurrentStateProperty",
typeof(Phases),
typeof(UIStateModel));
public Phases CurrentState
{
get { return (Phases)GetValue(CurrentStateProperty); }
set { SetValue(CurrentStateProperty, value); }
}
public Visibility Window1Visible // Databound to Window1.Visibility
{
get
{
if (this.CurrentState == Phases.Phase1) return Visibility.Visible;
else return Visibility.Hidden;
}
}
public Visibility Window2Visible // Databound to Window2.Visibility
{
get
{
if (this.CurrentState == Phases.Phase2) return Visibility.Visible;
else return Visibility.Hidden;
}
}
...
}
Проблема в том, что привязка данных к приведенному выше коду не работает, потому что свойства WindowXVisible не являются DependencyProperty-ами. Если я переведу все свойства в DependencyProperty, то введу избыточность в управление состоянием. Помимо дополнительной нагрузки, связанной с синхронизацией всего, это может даже стать несогласованным (если я не смогу хорошо синхронизировать).
Каким будет правильный способ избежать введения избыточности в управление состоянием пользовательского интерфейса, но при этом использовать возможности привязки данных, обеспечиваемые DependencyProperty-s?
ItemsControl
с DependencyProperty, который изменяет видимость ваших детей при ее изменении? Я также разместил альтернативный метод в качестве ответа. - person myermian   schedule 21.04.2011