Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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_Binding - Fatal编程技术网

C# 为什么这种类型的绑定有奇怪的行为?

C# 为什么这种类型的绑定有奇怪的行为?,c#,wpf,binding,C#,Wpf,Binding,比如说: 或者,可以使用句点(.)路径绑定到当前 来源。例如,Text=“{Binding}”等同于Text=“{Binding}” 路径=。}” 但在下面的两个例子中,我遇到了不同的行为: 第一名: <StackPanel> <TextBox Text="{Binding Path=MyString, UpdateSourceTrigger=PropertyChanged}"/> <Grid DataContext="{Binding Path

比如说:

或者,可以使用句点(.)路径绑定到当前 来源。例如,Text=“{Binding}”等同于Text=“{Binding}” 路径=。}”

但在下面的两个例子中,我遇到了不同的行为:

第一名:

  <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,你说得对。请回答您的评论,接受作为回答,当然更详细,我审查了几次您的评论,以了解要点!