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