在我的风格中使用DataTrigger

在我的风格中使用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> 
+0

您能否将您应用'FavouriteRectangleStyle'的矩形的XAML发布到? –

+1

应该是并且它们都应该是相似的,你不需要Rectangle。因为你的风格目标是矩形。 – adminSoftDK

+1

你的''标签是否包含'Fill'属性?直接在标签中定义的属性,比如'',将始终优先于Style中的触发值,所以您的数据触发器中的值永远不会被应用。解决方案是在样式本身而不是标签中定义默认填充属性。例如,'' – Rachel

更改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}"/> 
+0

谢谢。我最初尝试过,但没有区别。 – miriyo

在你的窗口或用户控件的构造函数里面,你应该设置this.DataContext = this;否则绑定不正确的相应的窗口或用户控件工作。

+0

我的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)); 
    }  
} 
+0

嗨,我检查了我的DataContext和ViewModel和DataContext,一切工作正常。此问题在ListBox中,但ListBox的ItemsSource来自相同的DataContext。 我也使用相同的OnPropertyChanged()方法。 – miriyo

答案在原来的问题的编辑部分。感谢您的所有帮助