在我的风格中使用DataTrigger
我试图根据我的ViewModel中的值更改矩形的填充,但尽管尝试了所有我在网上找到的建议,但仍然无法正常工作。在我的风格中使用DataTrigger
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>
编辑:如此看来,我的结合是由于我的不正确的假设不正确的用户控件的DataContext的是,我应该直接绑定。
矩形在ListBox的模板中,并且具有“Items”,因为它是DataContext,所以通过改变它现在的工作“Binding”。
SOLUTION:
因为虽然所有帮助非常感谢
<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="Rectangle"
这里是我用于测试
<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}"/>
谢谢。我最初尝试过,但没有区别。 – miriyo
在你的窗口或用户控件的构造函数里面,你应该设置this.DataContext = this;否则绑定不正确的相应的窗口或用户控件工作。
我的DataContext工作正常。我在一个ListBox.ItemTemplate中使用这个矩形,而ListBox的ItemsSource来自同一个DataContext,它工作正常。 – miriyo
这可能是因为你错过实现INotifyPropertyChanged
接口,Theme属性更新到这一点:
private int _theme = 5;
public int Theme
{
get
{
return _theme;
}
set
{
if (_theme == value)
{
return;
}
_theme = value;
OnPropertyChanged();
}
}
,并确保您的代码隐藏或你的视图模型在这里实现接口
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>
和后面的代码:
public partial class MainWindow : Window,INotifyPropertyChanged
{
private int _theme = 5;
public int Theme
{
get
{
return _theme;
}
set
{
if (_theme == value)
{
return;
}
_theme = value;
OnPropertyChanged();
}
}
public MainWindow()
{
this.InitializeComponent();
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
Theme = Theme == 5 ? 4 : 5;
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
嗨,我检查了我的DataContext和ViewModel和DataContext,一切工作正常。此问题在ListBox中,但ListBox的ItemsSource来自相同的DataContext。 我也使用相同的OnPropertyChanged()方法。 – miriyo
答案在原来的问题的编辑部分。感谢您的所有帮助
您能否将您应用'FavouriteRectangleStyle'的矩形的XAML发布到? –
你的''标签是否包含'Fill'属性?直接在标签中定义的属性,比如'',将始终优先于Style中的触发值,所以您的数据触发器中的值永远不会被应用。解决方案是在样式本身而不是标签中定义默认填充属性。例如,' ' –
Rachel