我只是在玩一个简单的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外部更改Textbox时,如果我在Template内部更改Text,它会变为现实,但不会转换回来。
为什么?
谢谢!
最佳答案
<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是内容。即您的DataContext是一个字符串。在这种情况下,从绑定到TestString接收到的字符串。
使用监听来观察这一点。
编辑:
这是你想要的
<TextBox Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType=ContentPresenter}}"/>
顺便说一句:默认情况下,控件模板中的ContentPresenter本身会为您完成所有这些操作。
关于c# - ContentPresenter的缠结行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30341762/