C# 为什么这种类型的绑定有奇怪的行为?
比如说: 或者,可以使用句点(.)路径绑定到当前 来源。例如,Text=“{Binding}”等同于Text=“{Binding}” 路径=。}” 但在下面的两个例子中,我遇到了不同的行为: 第一名:C# 为什么这种类型的绑定有奇怪的行为?,c#,wpf,binding,C#,Wpf,Binding,比如说: 或者,可以使用句点(.)路径绑定到当前 来源。例如,Text=“{Binding}”等同于Text=“{Binding}” 路径=。}” 但在下面的两个例子中,我遇到了不同的行为: 第一名: <StackPanel> <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> <Grid DataContext="{Binding Path
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding}"></TextBox>
</Grid>
</StackPanel>
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding Path=.}"></TextBox>
</Grid>
</StackPanel>
此示例引发异常,并显示以下消息:
“双向绑定需要路径或XPath。”
秒:
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding}"></TextBox>
</Grid>
</StackPanel>
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding Path=.}"></TextBox>
</Grid>
</StackPanel>
这个例子运行正常,第一个文本框的文本变化反映到viewmodel,第一个文本框的文本也发生了变化,但当第二个文本框的文本变化时,并没有反映到viewmodel(或第一个文本框)
问题:我很感激有人能解释这两种情况吗
注意:父控件(如window)的DataContext是一个简单的类,具有一个可通知属性MyString:
谢谢。似乎只要有双向绑定,就需要{binding Path=.}。尝试将代码更改为:
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<!--<TextBox Text="{Binding}"></TextBox>-->
<Label Content="{Binding}"/>
</Grid>
</StackPanel>
而且效果很好。对原始代码的方式绑定也起作用
以下是一个相关主题:
编辑第二个文本框中的文本将替换文本框的DataContext中的字符串实例。它不更新任何属性。@Clemens,“DataContext中的字符串实例”是MyString,那么为什么不更新它呢?对于一种情况而不是另一种情况下的绑定错误:默认情况下,Text属性是双向绑定的,显然,binding类会检查Path属性在双向时是否已设置。然而,它似乎没有检查Path是表示属性还是仅表示源对象本身。“DataContext中的字符串实例”是MyString。不完全是,它只是
MyString
属性的值。编辑文本后将创建新的字符串值。请记住字符串是不可变的。@Clemens,你说得对。请回答您的评论,接受作为回答,当然更详细,我审查了几次您的评论,以了解要点!