ContentPresenter 的异常行为
Stange behavior of ContentPresenter
我只是在玩一个简单的 ContentPresenter
。
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<ContentPresenter Content="{Binding}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
此代码完美运行 - 如果我在 Stackpanel 文本框中输入内容,外部文本框就会生效。反之亦然。
如果我将代码更改为:
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<ContentPresenter Content="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
当我在 ContentPresenter 之外更改文本框时,它会被执行但是如果我在模板内更改文本,它不会被转换回来。
为什么?
谢谢!
<ContentPresenter Content="{Binding Path=TestString,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
绑定到路径=。表示绑定到 DataContext 对象。
在 ContentTemplate 内部,DataContext 就是内容。即您的 DataContext 是一个字符串。在这种情况下,String 从 Binding 接收到 TestString。
用snoop观察这个。
编辑:
这是您要找的东西吗
<TextBox Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
顺便说一句:默认情况下,ContentPresenter 本身在控件模板中为您完成所有这些工作。
我只是在玩一个简单的 ContentPresenter
。
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<ContentPresenter Content="{Binding}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
此代码完美运行 - 如果我在 Stackpanel 文本框中输入内容,外部文本框就会生效。反之亦然。
如果我将代码更改为:
<TextBox Text="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
<ContentPresenter Content="{Binding Path=TestString, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
当我在 ContentPresenter 之外更改文本框时,它会被执行但是如果我在模板内更改文本,它不会被转换回来。
为什么?
谢谢!
<ContentPresenter Content="{Binding Path=TestString,UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
<ContentPresenter.ContentTemplate>
<DataTemplate>
<StackPanel>
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</ContentPresenter.ContentTemplate>
</ContentPresenter>
绑定到路径=。表示绑定到 DataContext 对象。 在 ContentTemplate 内部,DataContext 就是内容。即您的 DataContext 是一个字符串。在这种情况下,String 从 Binding 接收到 TestString。
用snoop观察这个。
编辑:
这是您要找的东西吗
<TextBox Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
顺便说一句:默认情况下,ContentPresenter 本身在控件模板中为您完成所有这些工作。