如何使用 Binding="Binding" 以编程方式创建 DataTrigger?

Posted

技术标签:

【中文标题】如何使用 Binding="Binding" 以编程方式创建 DataTrigger?【英文标题】:How to create a DataTrigger programatically with Binding="Binding"?如何使用 Binding="Binding" 以编程方式创建 DataTrigger? 【发布时间】:2021-11-06 08:59:28 【问题描述】:

这个DataTrigger 在 C# 代码中的等价物是什么?

<DataTrigger
  Binding="Binding"
  Value="x:Null">
    <Setter
      Property=SomeProperty
      Value=SomeValue />
</DataTrigger>

我对如何创建Binding 持怀疑态度。这是正确的吗?

var trigger = new DataTrigger();
trigger.Value = null;
// Is this sufficient?
trigger.Binding = new Binding();
// Code to create the setter
// ...

【问题讨论】:

您应该在发布问题之前先进行搜索。 social.msdn.microsoft.com/Forums/vstudio/en-US/… 我看过这个链接。这是Binding="Binding",我不知道如何创建。 trigger.Binding = new Binding("."); 应该是等价的。但是,这和Binding="Binding" 在 DataTrigger 上都没有意义,因为它缺少可以更新并因此触发触发器的源属性。 没有路径(或值为“.”的路径)的绑定(在 XAML 中创建)仍将 DataContext 作为隐含源。并且 DC 可以从 null 变为 not null。所以在 XAML 中它可以工作 - 在 DataContextChanged 事件上。在后面的代码中,我认为 Source 必须是主动的、显式设置的,否则触发器的 Source 为 no Source 或 null 并且条件将始终为 true。 可能是当触发器被添加到 FrameworkElement 的样式并因此成为可视化树的一部分时,当前的 DataContext 也可能自动成为(触发器绑定的)源。正如他们所说,测试高于学习。 【参考方案1】:

这相当于您的 XAML:

var trigger = new DataTrigger()

    Value = null,
    Binding = new Binding(".")
;
trigger.Setters.Add(new Setter()  Property = SomeProperty, Value = SomeValue );

【讨论】:

以上是关于如何使用 Binding="Binding" 以编程方式创建 DataTrigger?的主要内容,如果未能解决你的问题,请参考以下文章

使用knockout.js 完毕template binding

绑定 Binding Path=.,Binding.,Binding Source={StaticResource ResourceKey="Hello"} xmlns:sys=

06.Binding(绑定)02

“Binding Path=.”和“Binding”真的相等吗

Kotlin 中的 Android Dev,被教程弄糊涂了

get_called_class--后期静态绑定("Late Static Binding")类的名称