在WPF中绑定ContentPresenter的可见性时遇到问题

在WPF中绑定ContentPresenter的可见性时遇到问题,wpf,data-binding,binding,visibility,contentpresenter,Wpf,Data Binding,Binding,Visibility,Contentpresenter,我有以下XAML: <UserControl.Resources> <DataTemplate x:Key="ExpanderTemplate"> <Grid> <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" /> <Rectangle Stroke="Black" StrokeThic

我有以下XAML:

<UserControl.Resources>

<DataTemplate x:Key="ExpanderTemplate">
    <Grid>
        <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" />
        <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" />
        <Rectangle Stroke="Black" StrokeThickness="3" Width="2" Height="6" Fill="Black" />
    </Grid>
</DataTemplate>

<DataTemplate x:Key="CollapserTemplate">
    <Grid>
        <Rectangle Stroke="Black" StrokeThickness="1" Width="10" Height="10" Fill="White" />
        <Rectangle Stroke="Black" StrokeThickness="1" Width="6" Height="1" Fill="Black" />
    </Grid>
</DataTemplate>

</UserControl.Resources>

<Grid>
<StackPanel Orientation="Horizontal">
    <TextBlock Text="{Binding Path=Name}" />
    <Grid>
        <ContentPresenter x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" />
        <ContentPresenter x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" />
    </Grid>
</StackPanel>
</Grid>
我遇到的问题是,与可见性对象的绑定从未发生过。使用名称字符串的绑定确实发生了,并且我已经验证了这一点(通过可视化和向外扩展并在getter中放置断点),但是当我在CollapserVisibility和ExpanderVisibility对象的getter中放置断点时,这些断点甚至从未被命中。为什么会这样?我在VisualStudio的输出窗口中也没有收到任何绑定错误,这使我更加困惑,因此它的行为就好像绑定设置正确一样

不允许我绑定ContentPresenter的可见性属性吗?我还尝试将可见性绑定移动到数据模板(在XAML中)中的“网格”对象上,但没有效果……它不起作用


我的装订有什么问题?感谢您的帮助。

您是否曾将任何内容放入contentpresenter?它可能没有显示任何东西,因为没有什么可显示。datatemplate规定了数据的外观,但您需要首先实际将数据放入其中

除此之外,绑定看起来应该适用于初始值,但如果IsExpandable或IsExpanded属性发生更改,它们将不会更新


使用MultiDataTrigger控制可见性可能会更好。

您是否将任何内容放入contentpresenter?它可能没有显示任何东西,因为没有什么可显示。datatemplate规定了数据的外观,但您需要首先实际将数据放入其中

除此之外,绑定看起来应该适用于初始值,但如果IsExpandable或IsExpanded属性发生更改,它们将不会更新


使用MultiDataTrigger控制可见性可能会更好。

如果将
ContentPresenter
更改为
ContentControl
,它会工作(因为它绑定到可见性属性-我忽略了VM不会通知更改的事实):



我真的无法解释为什么会这样,除了
ContentPresenter
应该在
ContentControl
的模板中使用之外。但是,对我来说,它应该仍然有效。我认为这需要一些基于反射器的搜索来解决这个问题。

如果您将
ContentPresenter
更改为
ContentControl
,它会工作(因为它绑定到您的可见性属性-我忽略了您的虚拟机不会通知更改的事实):



我真的无法解释为什么会这样,除了
ContentPresenter
应该在
ContentControl
的模板中使用之外。但是,对我来说,它应该仍然有效。我认为这需要一些基于反射器的侦查来找出答案。

显然这不是你的答案,但其他人可能会发现这很有用

如果绑定到bool,请不要忘记包含bool到可见性转换器

..., Converter={StaticResource BoolToVis}}"

显然这不是你的答案,但其他人可能会觉得这很有用

如果绑定到bool,请不要忘记包含bool到可见性转换器

..., Converter={StaticResource BoolToVis}}"

嗯,我的印象是,我可以定义ContentTemplate,并让这些模板中的UI显示出来,即使没有专门定义Content属性。无论如何,我尝试将网格对象从数据模板中取出,并将其原始放入UserControl.Resources中,然后我定义了Content属性以将其用作静态资源,并且可以正常工作。谢谢你的建议。至于可视性的更新,是的,我知道。我将在这些东西上实现INotifyPropertyChanged,我只是想首先让绑定工作。嗯,我的印象是,我可以定义ContentTemplate,并让这些模板中的UI显示,即使没有特别定义Content属性。无论如何,我尝试将网格对象从数据模板中取出,并将其原始放入UserControl.Resources中,然后我定义了Content属性以将其用作静态资源,并且可以正常工作。谢谢你的建议。至于可视性的更新,是的,我知道。我将在这些东西上实现inotifyproperty更改,我只是想让绑定首先工作。
..., Converter={StaticResource BoolToVis}}"