Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从文本块中删除字典资源引用?_C#_Wpf_Dictionary_Binding - Fatal编程技术网

C# 如何从文本块中删除字典资源引用?

C# 如何从文本块中删除字典资源引用?,c#,wpf,dictionary,binding,C#,Wpf,Dictionary,Binding,我有这个元素: <TextBlock Style="{StaticResource textReplyMessageStyle}"> <Run x:Name="answerMessage" Text="{Binding Message, Mode = OneWay, FallbackValue = ''}" /> </TextBlock> 绑定和字典引用一样完全工作,但是在设置了资源引用之后,

我有这个元素:

<TextBlock Style="{StaticResource textReplyMessageStyle}">
   <Run x:Name="answerMessage" Text="{Binding Message, Mode = OneWay, FallbackValue = ''}" />
</TextBlock>
绑定和字典引用一样完全工作,但是在设置了资源引用之后,我找不到使绑定再次工作的方法

我试图以编程方式重新执行绑定,但不起作用。。。 我发现的唯一可行的解决方法是以编程方式设置answerMessage的文本。
如何从Run元素中删除资源引用并使绑定再次工作

只需给出一点上下文,变量消息包含一个数字,资源应答消息未选中 包含文本“未选定”或不同语言的翻译,具体取决于程序上激活的词典。我必须使用动态资源引用,因为程序的语言可以随时更改


谢谢

解决此问题的一个简单方法是使
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>
通常在使用此方法后,可能不需要在代码隐藏中使用
x:Name
,因为更好的做法是让ViewModel完成所有工作,而不是视图背后的代码:

<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的确认,我最初的怀疑是正确的。
设置对运行(以及类似元素)的引用时,将丢失绑定属性。 我的问题的解决办法就是再做一次绑定

Binding b = new Binding(); 
b.Path = new PropertyPath("Message"); 
b.Source = this;  
BindingOperations.SetBinding(answerMessage, Run.TextProperty, b);
此解决方案解决了该问题,但可以通过将应答消息非所选资源设置为绑定消息元素来解决问题

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

如果资源是动态的,就像我的例子一样,您将需要某种OnChange事件来观察资源(或字典),以保持消息内容始终处于更新状态。

您可以显示绑定的代码吗?当您在Run元素上设置ResourceReference时,您会破坏在xaml中为其设置的绑定。重新绑定听起来是正确的,所以如果它不起作用,您需要查看调试输出以查看是否存在绑定错误。另一个问题是,为什么要更改运行本身的值,而不是更改它在ViewModel中绑定到的值?@JasonTyler@o_w我设法修复了它,实际上是绑定。这是我提醒组件的方式中的一个错误<代码>绑定b=新绑定();b、 路径=新属性路径(“消息”);b、 来源=此;BindingOperations.SetBinding(answerMessage,Run.TextProperty,b)@o_w你说得很好。这不是一个干净的解决方案。我没有设置ResourceReference,而是尝试通过以下方式将Answer\u Message\u Not\u Selected的内容链接到预绑定的Message obj:
Message=Application.Current.Resources[“Answer\u Message\u Not\u Selected”]。ToString()
,但这不是动态的,我找不到创建假设的“OnAnswerMessageResourceChange”的方法可以更新消息的事件。我将为此创建另一个票证以避免混淆。再次感谢各位。谢谢艾哈迈德,真的很好很干净的解决方案。不幸的是,我不能在我的例子中使用它,因为TextBlock对象是在一个更大的用户控件中使用的,该控件在不同的场景下使用,这些场景需要各种类型的应答消息(未选中的消息)。@xSanciopanzax将
{StaticResource应答消息(未选中的消息)}
更改为
{DynamicResource Answer_Message_Not_Selected}
,我以前遇到过同样的问题,当时我想更改颜色,但同时将默认颜色设置为活动颜色模式(深色或浅色)字典
Binding b = new Binding(); 
b.Path = new PropertyPath("Message"); 
b.Source = this;  
BindingOperations.SetBinding(answerMessage, Run.TextProperty, b);
Message = Application.Current.Resources["Answer_Message_Not_Selected "].ToString()