当绑定依赖项属性改变时,数据触发器不会触发

本文关键字:触发器 数据 依赖 绑定 属性 改变 | 更新日期: 2023-09-27 18:19:21

DataTrigger存在于ControlTemplate

<DataTrigger
    Binding="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, 
              Path=(ui:TreeViewItemHeader.IsDragTarget)}"
    Value="True">
    <Setter TargetName="PART_Content" Property="Foreground" Value="Red" />
</DataTrigger>

绑定属性IsDragTarget是一个附加属性,它被编码到一个自定义控件类中:

public static readonly DependencyProperty IsDragTargetProperty = DependencyProperty.RegisterAttached
        ("IsDragTarget", 
        typeof(bool), 
        typeof(TreeViewItemHeader),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public static void SetIsDragTarget(DependencyObject self, bool value)
{
    self.SetValue(IsDragTargetProperty, value);
}
public static bool GetIsDragTarget(DependencyObject self)
{
    return (bool)self.GetValue(IsDragTargetProperty);
}

问题可能描述为DataTrigger只在控件初始化时出现一次解决该值。更新属性值不会翻转数据触发器。

执行故障排除:

  • 在绑定中增加一个空白的IValueConverter"返回值";IValueConverter.Convert方法只被调用一次。
  • 执行调试步骤以验证附加的属性值是否更改。
  • DataTrigger.Value属性设置为False—附加属性的初始值;setter在控件初始化时触发一次。对该属性的后续更改没有触发数据触发器。
  • Visual Studio Output窗口没有显示绑定表达式警告。

当绑定依赖项属性改变时,数据触发器不会触发

是否严格要求使用DataTrigger ?我通过切换到Trigger:

让它工作
<Trigger Property="ui:TreeViewItemHeader.IsDragTarget" Value="True">
    <Setter TargetName="PART_Content" Property="Foreground" Value="Red" />
</Trigger>

不知道为什么DataTrigger不工作,虽然

您需要通过实现INotifyPropertyChanged接口来引发属性值更改事件

如下所示

getter &Setter应该这样定义:

public static readonly DependencyProperty IsDragTargetProperty = DependencyProperty.RegisterAttached
        ("IsDragTarget",
        typeof(bool),
        typeof(TreeViewItemHeader),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));
public bool IsDragTarget {
            get { return (bool)this.GetValue(IsDragTargetProperty); }
            set { this.SetValue(IsDragTargetProperty, value); }
        }