Как мне написать datatrigger, чтобы изменить значение свойства зависимости на основе изменения второго свойства зависимости? - PullRequest
1 голос
/ 18 октября 2011

Я хочу изменить состояние свойства зависимости (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 (), чтобы решить мою проблему довольно чисто.

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Если рассматриваемые свойства зависимостей определены в UserControl, вам нужно установить его свойство style, а не добавлять стиль по умолчанию в ресурсы.

для установки стиля в XAML

<UserControl.Style>
    <Style TargetType="{x:Type UserControls:MyUserControl}">
      <!-- Triggers -- >
    </Style>
</UserControl.Style>
2 голосов
/ 19 октября 2011

В дополнение к ответу Адама вы устанавливаете свойство Mode в теге <UserControl> где-нибудь? Если вы это сделаете, он перезаписывает сработавшее значение.

Кроме того, иногда у меня возникали проблемы с тем, что триггерное значение не устанавливается, если в стиле не определено значение по умолчанию.

Например, иногда это не будет работать

<UserControl.Style>
    <Style TargetType="{x:Type UserControls:MyUserControl}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
                <Setter Property="Mode" Value="Logon"/>
            </DataTrigger>
      </Style.Triggers>
    </Style>
</UserControl.Style>

в то время как это делает

<UserControl.Style>
    <Style TargetType="{x:Type UserControls:MyUserControl}">
        <Setter Property="Mode" Value="{x:Null}"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ViewType}" Value="ViewType2">
                <Setter Property="Mode" Value="Logon"/>
            </DataTrigger>
      </Style.Triggers>
    </Style>
</UserControl.Style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...