【问题标题】:DataTrigger not firing when bound dependency property changes绑定依赖属性更改时 DataTrigger 不触发
【发布时间】:2012-01-31 06:33:08
【问题描述】:

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 输出窗口未显示绑定表达式警告。

【问题讨论】:

  • PART_Content 是否在&lt;Tag&gt; 定义中定义了前景色?如果是这样,该值将覆盖任何触发值
  • @Rachel- 不,不是,但谢谢。

标签: c# wpf data-binding


【解决方案1】:

使用DataTrigger是否有严格要求?我已经通过切换到Trigger 来工作:

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

不知道为什么DataTrigger 不起作用。

【讨论】:

  • 来自文档。表示当绑定数据满足指定条件时应用属性值或执行操作的触发器。我猜一个属性不是绑定数据。
  • 我不太确定我为什么要使用 DataTrigger。我想我欺骗自己相信它是必需的,因为我在 ControlTemplate 内编写触发器,并且不能使用 Trigger.SourceName 属性来引用 UserControl 根。您的帖子让我顿悟,我根本不需要 SourceName。有用。谢谢。
【解决方案2】:

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

如here所示

【讨论】:

  • 你好苛刻。该属性实际上是一个附加的依赖属性,所以我不认为 INotifyPropertyChanged 是必需的。
  • WPF 主要基于属性系统,随着值的变化,我们需要调用 wpf 处理的属性更改通知
  • 我认为你最好阅读this MSDN article。
  • 好的,我之前没有注意到它是附加属性,而不是依赖属性..
  • 但请查看这篇文章,它使用 lil'bit 的 diff 方式作为附加属性.. deanchalk.me.uk/post/… 并在使用给定链接时注意这个问题.. stackoverflow.com/a/4297488/468718 :D
【解决方案3】:

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); }
        }

【讨论】:

  • Loxxy- 如果我们谈论的是依赖属性,你会写的。我们实际上是在谈论附加属性。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2013-09-05
  • 2023-03-28
  • 1970-01-01
  • 2014-06-14
  • 2019-03-14
  • 1970-01-01
  • 2014-04-13
相关资源
最近更新 更多