ContentPresenter的奇怪行为
本文关键字:ContentPresenter | 更新日期: 2023-09-27 17:49:46
我只是在玩一个简单的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>
当我改变Textbox外面的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>
绑定到Path=。表示绑定到DataContext对象。在ContentTemplate内部,DataContext就是Content。也就是说,你的DataContext是一个字符串。在这种情况下,从绑定到TestString接收的字符串。
使用snoop来观察。
编辑:
这是你要找的吗
<TextBox Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
顺便说一句:默认情况下,控件模板中的ContentPresenter会为你完成所有这些工作。