Я хочу изменить состояние свойства зависимости (Mode) в UserControl, вызванном изменением изменения второго свойства зависимости (ViewType).
Я попытался определить DataTrigger следующим образом, но по какой-то причине он не работает:
<UserControl.Resources>
<Style TargetType="{x:Type UserControls:MyUserControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
<Setter Property="Mode" Value="Logon"/>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
Чтобы убедиться, что моя привязка работает правильно, я написал следующий тестовый XAML в том же пользовательском элементе управления:
<Style x:Key="butstyle">
<Style.Triggers>
<DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
<Setter Property="Control.Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
Когда я назначил этот стиль кнопке, я вижу, что цвет переднего плана в нужный момент меняется на белый, что доказывает, что моя привязка к ViewType работает.
Мне кажется, мне нужно использовать стиль в usercontrol.resources (как в первом блоке кода выше), но свойство "Mode" никогда не устанавливается.
Это правильный способ сделать это? Я хотел бы попытаться сохранить это в XAML, если это возможно, но мне не нравится, как должны работать триггеры, когда они не связаны напрямую с визуальными элементами.
В случае необходимости свойство привязки ViewType определяется в родительском UserControl, а свойство Mode - в MyUserControl.
Обновление:
Я использовал конвертер, чтобы узнать, что мой триггер вызывается, однако мой сеттер по какой-то причине не включается. Вот код для моего DP, который я пытаюсь установить. Точки останова на neitehr set () и OnModeChanged () вызываются. Что-то не так с моим свойством зависимости?
public enum ModeStates { Logon, NextState }
public ModeStates Mode
{
get { return (ModeStates)GetValue(ModeProperty); }
set { SetValue(ModeProperty, value); }
}
protected static readonly DependencyProperty ModeProperty = DependencyProperty.Register(
"Mode", typeof(ModeStates), typeof(MyUserControl),
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnModeChanged))
);
private static void OnModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// .......
}
Обновление:
Мне удалось использовать DependencyPropertyDescriptor.AddValueChanged (), чтобы решить мою проблему довольно чисто.