作为MSDN说:
Optionally, a period (.) path can be used to bind to the current source. For example, Text="{Binding}" is equivalent to Text="{Binding Path=.}".
但在下面的两个示例中,我遇到了不同的行为:
首先:
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding}"></TextBox>
</Grid>
</StackPanel>
此示例引发异常并显示消息:
“双向绑定(bind)需要 Path 或 XPath。”
第二:
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<TextBox Text="{Binding Path=.}"></TextBox>
</Grid>
</StackPanel>
此示例运行正常,第一个 TextBox 文本更改反射(reflect)到 viewmodel,第一个 TextBox 的文本也更改,但是当第二个 TextBox 文本更改时,未反射(reflect)到 viewmodel(或第一个 TextBox)!
问题:有人能解释一下这两种情况吗?
注意:父控件(如窗口)的 DataContext 是一个带有 Notifiable 属性的简单类 MyString:
谢谢。
最佳答案
似乎只要有两种方式绑定(bind) {Binding Path=.} 是必需的。尝试将代码更改为:
<StackPanel>
<TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/>
<Grid DataContext="{Binding Path=MyString}">
<!--<TextBox Text="{Binding}"></TextBox>-->
<Label Content="{Binding}"/>
</Grid>
</StackPanel>
而且效果很好。在原始代码上,绑定(bind)方式也有效。
这是一个相关的话题:
关于c# - 为什么这种类型绑定(bind)有奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30343312/