仅使用XAML代码条件加载WPF控件

仅使用XAML代码条件加载WPF控件,wpf,Wpf,假设我有一个复杂的UI。根据可用的模型数据,某些控件毫无意义。我想有一个选项来“禁用”它们。“禁用”是指我不希望他们的数据绑定发生,因为他们的ViewModel不安全\未定义 在中,建议使用DataContentSelector 我想知道是否有一种不同的方法不使用xaml之外的代码。例如,使用VisualState的实现,如果数据为空,VisualState会将内容设置为某个空框 谢谢我使用这个技巧:对不起,英语不好 首先,我将DataContext绑定到VM并向其添加转换器 <Grid

假设我有一个复杂的UI。根据可用的模型数据,某些控件毫无意义。我想有一个选项来“禁用”它们。“禁用”是指我不希望他们的数据绑定发生,因为他们的ViewModel不安全\未定义

在中,建议使用DataContentSelector

我想知道是否有一种不同的方法不使用xaml之外的代码。例如,使用VisualState的实现,如果数据为空,VisualState会将内容设置为某个空框


谢谢

我使用这个技巧:对不起,英语不好

首先,我将DataContext绑定到VM并向其添加转换器

<Grid DataContext={Binding myvm, Converter={StaticResource mySwitchOfConverter}}

Util.SwitchContext是一个静态属性,我将在代码中设置和取消设置它。

我实现这一点的完全符合MVVM的方式如下:

<ContentControl Content="{Binding MySecondaryViewModel}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type myViewModels:SecondaryViewModel}">
            <myViews:SecondaryView />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>
假设您有一个MainViewModel类型的视图模型,该模型由MainView类型的视图显示

MainView需要有条件地显示SecondaryView类型的子视图,具体取决于MainViewModel中某些控件属性的值:当控件属性具有某个值时,将显示该视图;当控件属性具有另一个值时,将不显示该视图;当控件属性未显示时,我们不希望它只是被隐藏,我们希望它甚至不存在

介绍SecondaryViewModel类型的新视图模型。它甚至可以是一个空类,尽管您可能会发现一些有用的功能放在其中

在MainViewModel中,引入SecondaryViewModel类型的属性MySecondaryViewModel。这将是控制属性。最初,让此属性的值为null

在MainView的XAML中,定义ContentControl,如下所示:

<ContentControl Content="{Binding MySecondaryViewModel}">
    <ContentControl.Resources>
        <DataTemplate DataType="{x:Type myViewModels:SecondaryViewModel}">
            <myViews:SecondaryView />
        </DataTemplate>
    </ContentControl.Resources>
</ContentControl>
因此,现在,控制属性MySecondaryViewModel的空值控制SecondaryView的存在:

只要Control属性的值为null,框架就不会创建任何视图来显示它,ContentControl为空。它没有内容。 如果将SecondaryViewModel实例指定给属性,框架将创建SecondaryView实例以显示该属性。 如果以后再次将控制属性设置为null,则SecondaryView的实例将被销毁。
也许有人可以评论一下当Visibility崩溃时绑定会发生什么-我想它还会发生吗?
<UserControl.Resources>
  ...
  <DataTemplate x:Key="someControl" ...>
  <DataTemplate x:Key="somePlaceholderControl" ...>

</UserControl.Resources>

<ContentControl Content="{Binding}">
  <ContentControl.Style>
    <Style TargetType="ContentControl">

      <Setter Property="ContentTemplate" Value="{StaticResource somePlaceholderControl}" />

      <Style.Triggers>
        <DataTrigger Binding="{Binding SomeTriggerProperty}" Value="SomeTriggerValue">
          <Setter Property="ContentTemplate" Value="{StaticResource someControl}" />
        </DataTrigger>
      </Style.Triggers>

    </Style>
  </ContentControl.Style>
</ContentControl>