【问题标题】:Using a DataTrigger in my Style以我的风格使用 DataTrigger
【发布时间】:2016-04-28 01:19:43
【问题描述】:

我正在尝试根据我的 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 的模板中,并且具有“项目”,因为它是 DataContext,因此通过更改“绑定”它现在可以工作了。

非常感谢您提供的所有帮助:

解决方案:

<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>

【问题讨论】:

  • 您能否发布有关您将 FavouriteRectangleStyle 应用到的矩形的 XAML?
  • 这个 应该是这个 并且它们都应该和你相似不需要矩形。因为您的样式以矩形为目标。
  • 您的&lt;Rectangle&gt; 标签是否包含Fill 属性?直接在标签中定义的属性,如&lt;Rectangle Fill="White"&gt;,将始终优先于样式中的触发值,因此永远不会应用来自数据触发器的值。解决方案是在样式本身而不是标签中定义默认的 Fill 属性。例如,&lt;Setter Property="Fill" Value="White" /&gt;
  • 我的 Rectangle XAML 如下: 如果我删除“矩形”。作为 Setter 属性的一部分,IsMousOver 触发器根本不起作用。
  • 我应该补充一点,这个 Rectangle 正在 ListBox 中使用,并且 ItemsSource 是父控件的 DataContext 的属性,而“Theme”是父控件的 DataContext 的属性。

标签: wpf xaml datatrigger


【解决方案1】:

在原始问题的编辑部分回答。感谢大家的帮助

【讨论】:

    【解决方案2】:

    这可能是因为您错过了实现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() 方法。
    【解决方案3】:

    在你使用的窗口或用户控件的构造函数中,你应该设置 this.DataContext = this;否则绑定不能正确地用于相应的窗口或用户控件。

    【讨论】:

    • 我的 DataContext 工作正常。我在 ListBox.ItemTemplate 中使用这个矩形,ListBox 的 ItemsSource 来自同一个 DataContext,它工作正常。
    【解决方案4】:

    更改您的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}"/>
    

    【讨论】:

    • 谢谢。我最初尝试过,但没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 2014-08-21
    • 2015-08-03
    • 2013-07-11
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 2017-01-23
    相关资源
    最近更新 更多