绑定依赖项属性更改时,DataTrigger不会触发

时间:2012-01-01 02:48:05

标签: c# wpf data-binding

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只会出现一次解析值。更新属性值不会翻转DataTrigger。

执行了故障排除:

  • 空白IValueConverter“返回值”已添加到绑定中; IValueConverter.Convert方法只被调用一次。
  • 执行了调试步进以验证附加的属性值是否已更改。
  • DataTrigger.Value属性设置为False - 附加属性的初始值;当控件初始化时,Setters会触发一次。对该属性的后续更改未触发DataTrigger。
  • Visual Studio“输出”窗口不显示绑定表达式警告。

3 个答案:

答案 0 :(得分:3)

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

来实现它
<Trigger Property="ui:TreeViewItemHeader.IsDragTarget" Value="True">
    <Setter TargetName="PART_Content" Property="Foreground" Value="Red" />
</Trigger>

不知道为什么DataTrigger无效。

答案 1 :(得分:0)

您需要通过实现INotifyPropertyChanged接口

来提升属性值更改事件

here

所示

答案 2 :(得分:0)

不应该是吸气剂&amp; 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); }
        }