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的奇怪行为

 <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会为你完成所有这些工作。