我只是在玩一个简单的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之外更改文本框时,如果我更改了模板中的文本而没有转换回来,那么它就会被实现。
为什么?
谢谢!
答案 0 :(得分:1)
<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是一个字符串。在这种情况下,从Binding到TestString接收的String。
使用窥探观察此事。
编辑:
这就是你要找的东西
<TextBox Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
BTW:默认情况下,ContentPresenter在控件模板中自行完成所有这些操作。