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