开发者

DataTemplate default visibility for ContentControls

In my MVVM based WPF application I have a lot of different ViewModel types that dynamically loaded into ContentControls or ContentPresenters. Therefor I need to explictly set what DataTemplate is to be used in XAML:

<ContentControl Content={Binding SomePropertyOfTypeViewModel} ContentTemplate={StaticResource someTemp开发者_开发技巧late} />

Now my problem is that the content control is displaying the UI of someTemplate even if the ContentControl is bound to nothing (i.e ViewModel.SomePropertyOfTypeViewModel is null) Is there a quick and easy way to make all ContentControls display nothing if they are currently bound to nothing? When I use implicit DataTemplates everything works as expected. Unfortunately I can't use this mechanism here.

Update:

My current solution is to have one extra bool Visible property for each ViewModel that is exposed as a property in the parent ViewModels. It returns true only when the the property is not null. The ContentControl's Visiblibilty is bound to this property. ParentViewModel.SomePropertyOfTypeViewModelVisible, ParentViewModel.SomeOtherPropertyOfTypeViewModelVisible ...

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

This is not very satisfying because I have to maintain a lot of extra properties.


Would setting the 'Visibility' of the ContentControl solve your problem? If so, in your ViewModel, you could create a Visibility property for the Visibility of the ContentControl to bind to. In the property, you could check to see if SomePropertyOfTypeViewModel is null. When setting the SomePropertyOfTypeViewModel, you would also want to notify that the ContentControlVisibility property changed.

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

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


Using a TemplateSelector seems to be as good as it gets.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜