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

时间:2011-06-15 15:18:39

标签: wpf

假设我有一个复杂的用户界面。根据可用的MODEL数据,某些控件没有意义。我想有一个选项'禁用'他们。通过'禁用',我的意思是我不希望他们的DataBinding发生,因为他们的ViewModel是不安全的\ undefined。

this post中,建议使用DataContentSelector。

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

由于

3 个答案:

答案 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的实例以显示它。
  • 如果以后再将控制属性设置为null,则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>