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

时间:2010-09-03 15:33:54

标签: 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" 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>

正如您所看到的,它本质上是一个文本块,其内容绑定到一个名称,以及两个内容提供者,它们的可见性绑定到源类上的几个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; }
}

我遇到的问题是,与Visibility对象的绑定从未发生过。与名称字符串的绑定发生,并且我已经验证了(在视觉上和扩展并在getter中放置断点),但是当我在CollapserVisibility和ExpanderVisibility的getter中放置断点时对象,那些断点永远不会被击中。为什么是这样?我也没有在Visual Studio的输出窗口中收到任何绑定错误,这进一步让我感到困惑,所以它就像绑定设置正确一样。

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

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

3 个答案:

答案 0 :(得分:9)

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

<ContentControl x:Name="ExpanderPresenter" ContentTemplate="{StaticResource ExpanderTemplate}" Visibility="{Binding ExpanderVisibility}" />
<ContentControl x:Name="CollapserPresenter" ContentTemplate="{StaticResource CollapserTemplate}" Visibility="{Binding CollapserVisibility}" />

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

答案 1 :(得分:1)

您是否曾将任何内容添加到内容提供者中?它可能没有显示任何东西,因为没有什么可以显示。数据模板决定了数据的外观,但您需要先将数据放入其中。

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

使用MultiDataTrigger来控制可见性可能要好得多。

答案 2 :(得分:0)

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

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

.content img {
     width: 55px;   
}
相关问题