【问题标题】:Having trouble binding the Visibility of a ContentPresenter in WPF在 WPF 中绑定 ContentPresenter 的可见性时遇到问题
【发布时间】:2011-04-07 22:16:32
【问题描述】:

我有以下 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>

如您所见,它本质上是一个文本块,其内容绑定到一个名称,两个 contentpresenter 的可见性绑定到源类上的几个 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 对象的绑定从未发生过。与名称字符串 does 的绑定发生了,并且我已经验证了这一点(无论是在视觉上还是通过展开并在 getter 中放置一个断点),但是当我在 CollapserVisibility 和 ExpanderVisibility 的 getter 中放置断点时对象,那些断点甚至永远不会被击中。为什么是这样?我在 Visual Studio 的输出窗口中也没有收到任何绑定错误,这进一步让我感到困惑,所以它的行为就像绑定设置正确一样。

我不允许绑定 ContentPresenter 的 Visibility 属性吗?我还尝试将可见性绑定移动到数据模板(在 XAML 中)中的“网格”对象上,但无济于事......它没有用。

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

【问题讨论】:

    标签: wpf data-binding binding visibility contentpresenter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 嗯 我的印象是,即使没有专门定义 Content 属性,我也可以定义 ContentTemplate 并让这些模板中的 UI 显示出来。无论如何,我尝试将 Grid 对象从数据模板中取出,并将它们原始放在 UserControl.Resources 中,然后我定义了 Content 属性以将它们用作静态资源,并且它可以工作。所以感谢您的建议。至于能见度的更新,是的,我知道。我将在这些东西上实现 INotifyPropertyChanged,我只是想让绑定首先工作。
      【解决方案3】:

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

      如果您绑定到布尔值,请不要忘记将布尔值包含到可见性转换器。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 2010-12-01
        • 2012-05-23
        • 2013-12-21
        • 2018-12-28
        • 1970-01-01
        相关资源
        最近更新 更多