【发布时间】:2021-01-06 18:40:37
【问题描述】:
我有这个元素:
<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 包含文本“未选择”或不同语言的翻译,具体取决于程序上激活的词典。我必须使用动态资源引用,因为程序的语言可以随时更改。
谢谢!
【问题讨论】:
-
你能显示你的绑定重做代码吗?
-
当您在 Run 元素上设置资源引用时,您会破坏您在 xaml 中为其设置的绑定。重新绑定听起来是正确的,所以如果它不起作用,您需要查看调试输出以查看是否存在绑定错误。另一个问题是,为什么要更改 run 本身的值,而不是更改它在 ViewModel 中绑定的值?
-
@JasonTyler @o_w 我设法修复它,它确实是绑定。这是我提醒组件的方式错误。
Binding b = new Binding(); b.Path = new PropertyPath("Message"); b.Source = this; BindingOperations.SetBinding(answerMessage, Run.TextProperty, b); -
@o_w 你的观点非常好。这不是一个干净的解决方案。我没有设置 ResourceReference,而是尝试通过以下方式将 Answer_Message_Not_Selected 的内容链接到预绑定的消息 obj:
Message =Application.Current.Resources["Answer_Message_Not_Selected "].ToString()但这不是动态的,我无法找到一种方法来创建可以更新消息的假设“OnAnswerMessageResourceChange”事件. -
我将为此创建另一个票证以避免混淆。再次感谢大家。
标签: c# wpf dictionary binding