Wpf 在我的风格中使用DataTrigger

Wpf 在我的风格中使用DataTrigger,wpf,xaml,datatrigger,Wpf,Xaml,Datatrigger,我正在尝试根据ViewModel中的值更改矩形的填充,但尽管尝试了我在网上找到的所有建议,它仍然不起作用 IsMouseOver触发器工作正常,但忽略DataTrigger,尽管我的ViewModel属性中始终存在4或5 有人能告诉我哪里出了问题吗 谢谢 这是我的风格: <Style x:Key="FavouriteRectangleStyle" TargetType="{x:Type Rectangle}"> <Setter Property=

我正在尝试根据ViewModel中的值更改矩形的填充,但尽管尝试了我在网上找到的所有建议,它仍然不起作用

IsMouseOver触发器工作正常,但忽略DataTrigger,尽管我的ViewModel属性中始终存在4或5

有人能告诉我哪里出了问题吗

谢谢

这是我的风格:

        <Style x:Key="FavouriteRectangleStyle" TargetType="{x:Type Rectangle}">
        <Setter Property="Opacity" Value="1"/>
        <Style.Triggers>

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>


            <DataTrigger Binding="{Binding Path=Theme}" Value="4">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__hex646464__shadow}"/>
            </DataTrigger>

            <DataTrigger Binding="{Binding Path=Theme}" Value="5">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__favorit__hexebebeb__shadow}"/>
            </DataTrigger>

        </Style.Triggers>
    </Style>

编辑:看来我的绑定是不正确的,因为我错误地假设UserControl的DataContext是我应该引导绑定的地方

矩形位于ListBox的模板中,并且具有“Items”作为其DataContext,因此通过更改“Binding”它现在可以工作

非常感谢所有的帮助:

解决方案:

<Style x:Key="FavouriteRectangleStyle" TargetType="{x:Type Rectangle}">
        <Setter Property="Opacity" Value="1"/>
        <Style.Triggers>

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>

            <DataTrigger Binding="{Binding DataContext.Theme,
                       RelativeSource={RelativeSource Mode=FindAncestor, 
                                               AncestorType=UserControl} }" Value="4">
                <Setter Property="Rectangle.Fill" 
                                    Value="{DynamicResource content__star__hex646464__shadow}"/>
            </DataTrigger>

            <DataTrigger Binding="{Binding DataContext.Theme,
                       RelativeSource={RelativeSource Mode=FindAncestor, 
                                               AncestorType=UserControl} }" Value="5">
                <Setter Property="Rectangle.Fill" 
                          Value="{DynamicResource content__star__favorit__hexebebeb__shadow}"/>
            </DataTrigger>

        </Style.Triggers>
    </Style>

更改您的
TargetType=“矩形”

下面是我用来测试的代码

 <Style x:Key="FavouriteRectangleStyle" TargetType="Rectangle">
        <Setter Property="Fill" Value="Blue"/>           
        <Setter Property="Opacity" Value="1"/>           
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>

            <DataTrigger Binding="{Binding Theme}" Value="4">
                <Setter Property="Fill" Value="Red"/>                  
            </DataTrigger>

            <DataTrigger Binding="{Binding Theme}" Value="5">
                <Setter Property="Fill" Value="Black"/>
            </DataTrigger> 

        </Style.Triggers>
</Style>

以及实施情况

<Rectangle Style="{StaticResource FavouriteRectangleStyle}"/>

更改您的
TargetType=“矩形”

下面是我用来测试的代码

 <Style x:Key="FavouriteRectangleStyle" TargetType="Rectangle">
        <Setter Property="Fill" Value="Blue"/>           
        <Setter Property="Opacity" Value="1"/>           
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>

            <DataTrigger Binding="{Binding Theme}" Value="4">
                <Setter Property="Fill" Value="Red"/>                  
            </DataTrigger>

            <DataTrigger Binding="{Binding Theme}" Value="5">
                <Setter Property="Fill" Value="Black"/>
            </DataTrigger> 

        </Style.Triggers>
</Style>

以及实施情况

<Rectangle Style="{StaticResource FavouriteRectangleStyle}"/>


在您的窗口或用户的构造函数中控制您所使用的内容,您应该设置此项。DataContext=this;否则,绑定对于相应的窗口或用户控件来说无法正常工作。

在您的窗口或用户控件的构造函数中,您应该设置this.DataContext=this;否则,绑定对于相应的窗口或用户控件无法正常工作。

这可能是因为您未能实现
INotifyPropertyChanged
接口,请将您的主题属性更新为:

 private int _theme = 5;
    public int Theme
    {
        get
        {
            return _theme;
        }

        set
        {
            if (_theme == value)
            {
                return;
            }

            _theme = value;
            OnPropertyChanged();

        }
    }
并确保codebehind或viewmodel正在实现该接口

public partial class MainWindow : Window,INotifyPropertyChanged
{
以下是完整的工作示例:

 Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <SolidColorBrush x:Key="content__star__hex646464__shadow" Color="Red"/>
    <SolidColorBrush x:Key="content__star__favorit__hexebebeb__shadow" Color="Green"/>
    <Style x:Key="FavouriteRectangleStyle" TargetType="{x:Type Rectangle}">
        <Setter Property="Opacity" Value="1"/>
        <Style.Triggers>

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>


            <DataTrigger Binding="{Binding Path=Theme}" Value="4">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__hex646464__shadow}"/>
            </DataTrigger>

            <DataTrigger Binding="{Binding Path=Theme}" Value="5">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__favorit__hexebebeb__shadow}"/>
            </DataTrigger>

        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <Rectangle Style="{StaticResource FavouriteRectangleStyle}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Height="100"></Rectangle>
    <Button Content="Change Theme" Click="ButtonBase_OnClick"></Button>
</StackPanel>

这可能是因为您未能实现
INotifyPropertyChanged
接口,请将您的主题属性更新为:

 private int _theme = 5;
    public int Theme
    {
        get
        {
            return _theme;
        }

        set
        {
            if (_theme == value)
            {
                return;
            }

            _theme = value;
            OnPropertyChanged();

        }
    }
并确保codebehind或viewmodel正在实现该接口

public partial class MainWindow : Window,INotifyPropertyChanged
{
以下是完整的工作示例:

 Title="MainWindow" Height="350" Width="525" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
    <SolidColorBrush x:Key="content__star__hex646464__shadow" Color="Red"/>
    <SolidColorBrush x:Key="content__star__favorit__hexebebeb__shadow" Color="Green"/>
    <Style x:Key="FavouriteRectangleStyle" TargetType="{x:Type Rectangle}">
        <Setter Property="Opacity" Value="1"/>
        <Style.Triggers>

            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Rectangle.Opacity" Value="0.5" />
            </Trigger>


            <DataTrigger Binding="{Binding Path=Theme}" Value="4">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__hex646464__shadow}"/>
            </DataTrigger>

            <DataTrigger Binding="{Binding Path=Theme}" Value="5">
                <Setter Property="Rectangle.Fill" Value="{DynamicResource content__star__favorit__hexebebeb__shadow}"/>
            </DataTrigger>

        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <Rectangle Style="{StaticResource FavouriteRectangleStyle}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="200" Height="100"></Rectangle>
    <Button Content="Change Theme" Click="ButtonBase_OnClick"></Button>
</StackPanel>

回答原始问题的编辑部分。感谢所有帮助

回答原始问题的编辑部分。感谢所有的帮助

您能否发布有关您应用
收藏夹矩形样式
的矩形的XAML?这应该是这个,所有这些都应该是相似的,您不需要矩形。因为您的样式以矩形为目标。您的
标记是否包含
Fill
属性?直接在标记中定义的属性(如
)始终优先于样式中的触发值,因此数据触发器中的值永远不会应用。解决方案是在样式本身而不是在标记中定义默认填充特性。例如,
我的矩形XAML如下所示:如果我从Setter属性中删除“Rectangle.”部分,IsMousOver触发器根本不起作用。我应该补充一点,这个矩形正在列表框中使用,ItemsSource是父控件和“Theme”的DataContext属性是父控件的DataContext的属性。请发布有关应用
FavoriteRectangleStyle
的矩形的XAML好吗?应该是这样的,所有这些都应该是相似的,您不需要矩形。因为您的样式以矩形为目标。您的
标记是否包含
Fill
属性?直接在标记中定义的属性(如
)始终优先于样式中的触发值,因此数据触发器中的值永远不会应用。解决方案是在样式本身而不是在标记中定义默认填充特性。例如,
我的矩形XAML如下所示:如果我从Setter属性中删除“Rectangle.”部分,IsMousOver触发器根本不起作用。我应该补充一点,这个矩形正在列表框中使用,ItemsSource是父控件和“Theme”的DataContext属性是父控件的DataContext的属性。我的DataContext工作正常。我在ListBox.ItemTemplate中使用了这个矩形,ListBox的ItemsSource来自同一个DataContext,工作正常。我的DataContext工作正常。我在ListBox.ItemTemplate中使用此矩形,ListBox的ItemsSource来自同一DataContext,工作正常。您好,我检查了DataContext和ViewModel,关于DataContext,一切正常。此问题在ListBox中,但ListBox的ItemsSource来自相同的DataContext。我也在使用相同的OnPropertyChanged()方法。您好,我检查了我的DataContext和ViewModel,关于DataContext,一切正常。此问题在ListBox中,但ListBox的ItemsSource来自相同的DataContext。我也在使用相同的OnPropertyChanged()方法。谢谢。我一开始试过了,但没什么不同。谢谢。我一开始试过,但没什么不同。