MultiTrigger: привязка условия к DependencyProperty не работает

У меня есть пользовательская кнопка MainMenuButton типа UserControl, и я занимаюсь ее стилем. Теперь я хотел реализовать MultiTrigger, чтобы изменить внешний вид кнопки только при соблюдении двух условий.

Первое условие, если IsMouseOver == true. Я просто поставил следующее Condition:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <Setter TargetName="LayoutRoot" Property="Background" Value="Red">
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <Setter TargetName="LayoutRoot" Property="Background" Value="Black">
    </MultiTrigger.ExitActions>
</MultiTrigger>

Второе условие связано с DependencyProperty:

public static readonly DependencyProperty IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(MainMenuButton), new PropertyMetadata(false));

В другом сообщении SO пользователь сказал, что я могу используйте DataTrigger, чтобы отреагировать на IsCheckedProperty. Итак, я попробовал код из другого поста, но он не сработал:

<MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}" Value="False"/>
    </MultiTrigger.Conditions>
    <MultiTrigger.EnterActions>
        <BeginStoryboard Storyboard="{StaticResource MouseEnter}"/>
    </MultiTrigger.EnterActions>
    <MultiTrigger.ExitActions>
        <BeginStoryboard Storyboard="{StaticResource MouseLeave}"/>
    </MultiTrigger.ExitActions>
</MultiTrigger>

Как это решить? Спасибо за любые ответы! :)


person TorbenJ    schedule 23.09.2012    source источник


Ответы (4)



Я думаю, в вашем стиле вы не указали правильный TargetType. Это должно работать -

<Style TargetType="{x:Type local:MainMenuButton}">
   <MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="True"/>
        <Condition Binding="IsChecked" Value="False"/>
    </MultiTrigger.Conditions>
    // Your setter goes here
</MultiTrigger>
</Style>

Пространство имен local должно быть добавлено в xaml, которое соответствует пространству имен, в котором находится ваш класс MainMenuButton.

person Rohit Vats    schedule 23.09.2012

Я думаю, вам не нужно привязываться к вашему DP, попробуйте использовать просто Property="IsChecked" как для IsMouseOver.

person Sebastian Ðymel    schedule 23.09.2012
comment
Нет, это не работает. Затем ошибка не может найти свойство шаблона IsChecked для типа «System.Windows.Controls.UserControl». происходит - person TorbenJ; 23.09.2012
comment
Таким образом, это может быть проблемой, ваш целевой тип шаблона элемента управления является стандартным UserControl вместо вашего пользовательского типа элемента управления. Когда вы создаете шаблон для пользовательского элемента управления, все DP могут быть прикреплены к триггеру Property=. - person Sebastian Ðymel; 23.09.2012

person    schedule
comment
Добавьте объяснение, чтобы не удалить свой ответ. - person rekaszeru; 15.05.2014