DataTemplate ContentControls的默认可见性

时间:2010-05-03 14:56:30

标签: mvvm datatemplate visibility contentcontrol

在我基于MVVM的WPF应用程序中,我有很多不同的ViewModel类型,它们动态加载到ContentControls或ContentPresenters中。因此,我需要明确地设置要在XAML中使用的DataTemplate:

<ContentControl Content={Binding SomePropertyOfTypeViewModel} ContentTemplate={StaticResource someTemplate} />

现在我的问题是内容控件显示的是someTemplate的UI,即使ContentControl没有绑定(即ViewModel.SomePropertyOfTypeViewModel为null) 是否有一种快速简便的方法可以使所有ContentControls在没有任何内容的情况下显示任何内容?当我使用隐式DataTemplates时,一切都按预期工作。不幸的是我不能在这里使用这种机制。

更新

我目前的解决方案是为每个ViewModel提供一个额外的bool Visible属性,该属性在父ViewModel中作为属性公开。仅当属性不为null时,它才返回true。 ContentControl的Visiblibilty绑定到此属性。 ParentViewModel.SomePropertyOfTypeViewModelVisible, ParentViewModel.SomeOtherPropertyOfTypeViewModelVisible ...

<ContentControl Content={Binding SomePropertyOfTypeViewModel} Visibility={Binding SomePropertyOfTypeViewModelVisible, Converter={StaticRresource boolToVisibiltyConverter}}" />

这不是很令人满意,因为我必须保留很多额外的属性。

2 个答案:

答案 0 :(得分:0)

设置ContentControl的“可见性”可以解决您的问题吗?如果是这样,在ViewModel中,您可以为要绑定的ContentControl的Visibility创建Visibility属性。在属性中,您可以检查SomePropertyOfTypeViewModel是否为null。设置SomePropertyOfTypeViewModel时,您还需要通知ContentControlVisibility属性已更改。

<ContentControl Content={Binding SomePropertyOfTypeViewModel} Visibility={Binding ContentControlVisibility} />

public Visibility ContentControlVisibility
    {
        get
        {
            return SomePropertyOfTypeViewModel == null ? Visibility.Collapsed : Visibility.Visible;
        }
    }

答案 1 :(得分:0)

使用TemplateSelector似乎一样好。