我只是在玩一个简单的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/

10-11 05:05