假设我有一个复杂的用户界面。根据可用的MODEL数据,某些控件没有意义。我想有一个选项'禁用'他们。通过'禁用',我的意思是我不希望他们的DataBinding发生,因为他们的ViewModel是不安全的\ undefined。
在this post中,建议使用DataContentSelector。
我想知道是否存在不使用xaml之外的代码的不同方法。例如,使用VisualState的实现,如果数据为空,VisualState将内容设置为某个空框。
由于
答案 0 :(得分:0)
我使用这个技巧:(抱歉英语不好)
首先我将我的DataContext绑定到我的VM并添加一个转换器
<Grid DataContext={Binding myvm, Converter={StaticResource mySwitchOfConverter}}
在我的转换器中我有这样的东西:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if(Util.SwitchContext == true)
return value;
return null;
}
Util.SwitchContext是一个静态属性,我将在我的代码中设置和取消它。
答案 1 :(得分:0)
我实现这一目标的完全符合MVVM的方式如下:
假设您有一个MainViewModel
类型的视图模型,该视图模型正在由MainView
类型的视图显示。
MainView
需要 有条件 显示类型为SecondaryView
的子视图,具体取决于某些 MainViewModel
中的控制属性 :当控制属性具有某个值时,将显示该视图;当控制属性具有另一个值时,将不显示该视图;以及当它不显示时,我们不希望它被隐藏,我们甚至希望它不存在。
引入类型为SecondaryViewModel
的新视图模型。它甚至可以是一个空类,尽管您可能会发现一些有用的功能。
在您的MainViewModel
中引入类型MySecondaryViewModel
的属性SecondaryViewModel
。这将是控制属性。最初,让此属性的值为null
。
在MainView
的XAML中,如下定义ContentControl
:
<ContentControl Content="{Binding MySecondaryViewModel}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type myViewModels:SecondaryViewModel}">
<myViews:SecondaryView />
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
因此,现在,控制属性MySecondaryViewModel
的空值控制着SecondaryView
的存在:
null
,框架就不会创建任何视图来显示它,并且ContentControl
为空。 (没有内容。)SecondaryViewModel
的实例分配给属性,则框架将创建SecondaryView
的实例以显示它。SecondaryView
的实例将被破坏。答案 2 :(得分:0)
<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>