无法在WPF中绑定ContentPresenter的可见性

Dav*_*vid 1 data-binding wpf 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" 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>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它本质上是一个文本块,其内容绑定到一个名称,以及两个内容提供者,它们的可见性绑定到源类上的几个Visibility对象.源类看起来像这样:

public class MyViewModel
{
public string Name { get; set; }

public Visibility CollapserVisibility
{
    get
    {
        if (IsExpandable && IsExpanded)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }
}

public Visibility ExpanderVisibility
{
    get
    {
        if (IsExpandable && !IsExpanded)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }
}

public bool IsExpanded { get; set; }
public bool IsExpandable { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,与Visibility对象的绑定从未发生过.与Name字符串的绑定确实发生了,我已经验证了(在视觉上和扩展并在getter中放置断点),但是当我在CollapserVisibility和ExpanderVisibility对象的getter中放置断点时,这些断点甚至都没有得到击中.为什么是这样?我也没有在Visual Studio的输出窗口中收到任何绑定错误,这进一步让我感到困惑,因此它就好像绑定设置正确一样.

我不允许绑定ContentPresenter的Visibility属性吗?我也尝试将Visibility绑定移动到数据模板中的"网格"对象(在XAML中),但无济于事......它不起作用.

我绑定有什么问题?谢谢你的帮助.

Ken*_*art 9

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

<ContentControl x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" />
<ContentControl x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" />
Run Code Online (Sandbox Code Playgroud)

我真的无法解释为什么会这样,除了ContentPresenter应该在a的模板中使用的事实ContentControl.但是,对我来说,它应该仍然有用.我认为这需要一些基于Reflector的侦察来解决这个问题.