c# - 为什么这种类型绑定(bind)有奇怪的行为?

标签 c# wpf binding

作为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)方式也有效。

这是一个相关的话题:

Are "{Binding Path=.}" and "{Binding}" really equal

关于c# - 为什么这种类型绑定(bind)有奇怪的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30343312/

相关文章:

c# - 如何在 C# asp 中分割带有多个空格的文件行?

c# - C# 中来自智能卡的证书

c# - HasDefaultValue 与从构造函数设置默认值

c# - WPF 面板标题标题

Java 将 bean 绑定(bind)到 String 空属性

c# - 为什么不能直接调用扩展方法?

WPF 数据网格 : disable editing in certain rows

.net - 如何抑制DataGrid单元格选择边框?

java - 更新后刷新JTable

php - 在查询中使用 MATCH AGAINST 绑定(bind)字符串