如何从TextBlock中删除字典资源引用



我有这个元素:

<TextBlock Style="{StaticResource textReplyMessageStyle}">
<Run x:Name="answerMessage" Text="{Binding Message, Mode = OneWay, FallbackValue = ''}" />
</TextBlock>

我需要在answerMessage中打印var Message的内容(由于绑定(或字典中的元素(由于下面代码所做的资源引用(。

answerMessage.SetResourceReference(Run.TextProperty, "Answer_Message_Not_Selected");

绑定和字典引用一样完全可以工作,但在设置了一次资源引用后,我找不到让绑定再次工作的方法。

我尝试以编程方式重新进行绑定,但不起作用。。。我找到的唯一可行的解决方法是以编程方式设置answerMessage的文本
如何从Run元素中删除资源引用并重新进行绑定?

仅仅为了给出一点上下文,变量Message包含一个数字,并且资源Answer_Message_Not_Selected包括文本">未选择";或者根据程序上活动的词典以不同语言进行翻译。我必须使用动态资源引用,因为程序的语言可以随时更改。

谢谢!

解决此问题的一个简单方法是使TextBlock的输出主要取决于Message属性。

例如,只有当Message的值不为空时,才能将Text的值绑定到Message,否则将其设置为您的资源:

<TextBlock Style="{StaticResource textReplyMessageStyle}">
<Run x:Name="answerMessage" >
<Run.Style>
<Style TargetType="{x:Type Run}">

<Setter Property="Text" Value="{Binding Message, Mode = OneWay, FallbackValue = ''}" />

<Style.Triggers>
<DataTrigger Binding="{Binding Message}" Value="{x:Null}">
<Setter Property="Text" Value="{StaticResource Answer_Message_Not_Selected}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Run.Style>
</Run>  
</TextBlock>

请注意,您应该在样式内设置Text的起始值,因为在控件初始值设定项中设置的属性将覆盖任何样式setter!

您可以做的另一件事是在视图模型中添加属性AnswerMessageSelected,而不是将Message的值设置为null,以便更明确地说明TextBlock何时应该更改其目标值:

<TextBlock Style="{StaticResource textReplyMessageStyle}">
<Run x:Name="answerMessage" >
<Run.Style>
<Style TargetType="{x:Type Run}">

<Setter Property="Text" Value="{Binding Message, Mode = OneWay, FallbackValue = ''}" />

<Style.Triggers>
<DataTrigger Binding="{Binding AnswerMessageSelected}" Value="False">
<Setter Property="Text" Value="{StaticResource Answer_Message_Not_Selected}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Run.Style>
</Run>  
</TextBlock>

通常,在使用此方法后,可能不需要在代码背后使用x:Name来引用,因为更好的做法是让ViewModel完成所有工作,而不是让View:后面的代码

<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource textReplyMessageStyle}">
<Setter Property="Text" Value="{Binding Message, Mode = OneWay, FallbackValue = ''}" />
<Style.Triggers>
<DataTrigger Binding="{Binding AnswerMessageSelected}" Value="False">
<Setter Property="Text" Value="{StaticResource Answer_Message_Not_Selected}" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>

我最初的怀疑是正确的,感谢@Jason Tyler@o_w的确认
当您设置对Run的引用(以及对类似元素的引用(时,将丢失绑定属性。我的问题的解决方法就是重新进行绑定。

Binding b = new Binding(); 
b.Path = new PropertyPath("Message"); 
b.Source = this;  
BindingOperations.SetBinding(answerMessage, Run.TextProperty, b);

此解决方案解决了问题,但也可以通过将Answer_Message_Not_Selected资源设置为绑定的Message元素来解决原因。

Message = Application.Current.Resources["Answer_Message_Not_Selected "].ToString()

如果资源是动态的,就像我的情况一样,您将需要某种OnChange事件来观察资源(或字典(,以保持Message的内容始终更新。

最新更新