我有以下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中),但无济于事......它不起作用。
我的绑定有什么问题?谢谢你的帮助。
答案 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;
}