根据用户的选择(或根据选择显示不同的UI组件的其他替代方法)使网格行可见

时间:2013-10-21 07:27:15

标签: wpf xaml mvvm user-controls

我正在设计一个WPF UserControl,它需要根据用户的选择显示不同的组件。但由于这个UserControl仍然相对简单,我决定只有一个View(这个UserControl)和一个ViewModel。基本上我所拥有的是一个组合框,它具有枚举值选项(至少三个选项),以指示用户想要看到的特定部分。对于单个组件,我现在设计的是,我有一个Grid多个GridRow。并且只有表示用户选择数据的行的可见性为Visible。其他行/视图的可见性为Collapsed。但有两个问题:

  1. 在一个网格行中,我有一个ScrollViewer。就我而言 已经了解到,我无法设置GridRow的高度所在 ScrollViewer位于Auto。因为滚动条会 从不使用Auto(因为实际高度足以显示所有高度,因此不需要滚动条)。但是,如果我没有将高度设置为 Auto,高度不会变为零(所以这一行不会 当我将此行的可见性设置为Collapsed时。对于 例如,如果我将网格行高度设置为*,然后将可见性设置为ScrollViewer 作为Collapsed的{​​{1}},ScrollViewer不会 显示但仍有一个空格对应一个空格 明星的身高。
  2. 正如我所提到的,我至少有3个选项/不同的观点。因此,从bool属性到可见性的绑定是不够的。我想我可以制作专用的转换器,但它不够通用。
  3. 任何人都可以告诉我,我如何实现我的目标,即根据用户的选择,使用一个UserControl(所有绑定到同一个ViewModel)显示不同的UI部分?

1 个答案:

答案 0 :(得分:2)

您可以将每个“视图”放入自己的Grid并创建一个EnumToVisibilityConverter来替换他们的Visibility

XAML:

<Grid>
    <Grid.Resources>
        <Converters:EnumToVisibilityConverter x:Key="EnumToVisibilityConverter" />
    </Grid.Resources>
    <Grid Name="View1" Visibility="{Binding EnumInstance, Converter={StaticResource 
        EnumToVisibilityConverter}, ConverterParameter=Option1">
        ...
    </Grid>
    <Grid Name="View2" Visibility="{Binding EnumInstance, Converter={StaticResource 
        EnumToVisibilityConverter}, ConverterParameter=Option2">
        ...
    </Grid>
    <Grid Name="View3" Visibility="{Binding EnumInstance, Converter={StaticResource 
        EnumToVisibilityConverter}, ConverterParameter=Option3">
        ...
    </Grid>
</Grid>

转换器:

[ValueConversion(typeof(Enum), typeof(Visibility))]
public class EnumToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null || parameter == null) return false;
        string enumValue = value.ToString();
        string targetValue = parameter.ToString();
        return enumValue.Equals(targetValue, 
            StringComparison.InvariantCultureIgnoreCase) ? Visibility.Visible : 
            Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

当然,这假设您知道如何将带有XML命名空间的Converter添加到XAML中,并且enum属性的名称为EnumIntanceenum值名为Option1Option2Option3

  

我无法对此进行测试,所以如果有任何问题请告诉我