【发布时间】:2021-09-22 16:48:30
【问题描述】:
我在 xaml <TextBlock Style="{StaticResource textStyle}" Text="{Binding DisplayText}" /> 中有一个绑定。
我正在尝试编写一个附加的行为来响应绑定的DisplayText 值的变化。如果我在 xaml 中指定 NotifyOnTargetUpdated=True,我可以对行为中的更改做出反应,一切都很好,但我宁愿不依赖于以特定方式绑定 Text 属性只是为了使行为起作用。
我的想法是在选择加入行为时更改现有 TextBlock.TextProperty 绑定上的 NotifyOnTargetUpdated 值。我正在使用以下代码执行此操作,其中 tb 是选择加入的 TextBlock。
var textBinding = BindingOperations.GetBinding(tb, TextBlock.TextProperty);
textBinding.NotifyOnTargetUpdated = true;
tb.SetBinding(TextBlock.TextProperty, textBinding);
行为是这样选择的,样式如下:
<Setter Property="behaviors:Text.AutoSizeText" Value="True"/>
最初这不起作用,因为textBinding 为空。我可以通过在行为属性之前在 xaml 中绑定 Text 属性来解决这个问题,但这仍然会留下我不喜欢的外部依赖项(xaml 排序)。如果我确实走这条路,我会得到以下异常,这似乎表明我根本无法以这种方式完成。
InvalidOperationException: Binding cannot be changed after it has been used.
那么,我该如何自动处理设置notifyOntArgetUpdupdupdupdupd the Text binding当行为被选择时?
【问题讨论】:
-
我已经添加了行为的用法,但我不确定你对绑定
DisplayText的意思 - 我在上面的 TextBlock xaml 中绑定了它。 -
我不确定是否有明智的方法来做到这一点...您可以拥有一个单独的属性来绑定,例如
my:Stuff.Text="{Binding DisplayText}"而不是绑定到Text,这会让您默认绑定到NotifyOnTargetUpdated = true -
您建议使用内部
Text属性,该属性与TextBlock.TextProperty绑定绑定到相同的目标,该属性是在正确设置NotifyOnTargetUpdated 值的代码中创建的。我相信这可行,谢谢。 -
是的,它必须在后台转发到
TextProperty,但它只是暴露了一个默认值略有不同的绑定。这仍然很丑陋,并且仍然很容易绑定到错误的属性,但是嘿,这是一个选项 -
也许我有些不明白,但 NotifyOnTargetUpdated 会打开有关 TextBlock.Text 更改的通知,而不是 DataContext.DisplayText。因此,您观看的不是 DisplayText,而是 Text。如果是这样,为什么不让 gording 更容易:绑定到 TextBlock.Text 属性。使用一个 DependecyProperty 创建一个内部 DependecyObject 并将其绑定到 TextBlock.Text。
标签: c# wpf attachedbehaviors