1

我有以下 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 对象的绑定甚至从未发生过。与 Name 字符串的绑定确实发生了,并且我已经验证了这一点(无论是在视觉上还是通过展开并在 getter 中放置一个断点),但是当我在 CollapserVisibility 和 ExpanderVisibility 对象的 getter 中放置断点时,这些断点甚至永远不会得到打。为什么是这样?我在 Visual Studio 的输出窗口中也没有收到任何绑定错误,这进一步让我感到困惑,所以它的作用就像绑定设置正确一样。

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

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

4

3 回答 3

9

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

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

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

于 2010-09-03T15:56:10.767 回答
1

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

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

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

于 2010-09-03T15:53:56.587 回答
0

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

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

..., Converter={StaticResource BoolToVis}}"
于 2015-10-16T19:47:16.093 回答