0

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

  1. 在一个网格行中,我有一个ScrollViewer. 据我所知,我无法将 GridRow 所在的高度设置 ScrollViewerAuto. 因为滚动条永远不会使用Auto(因为实际高度足够显示所有内容,所以不需要滚动条)。但是,如果我不将高度设置为 Auto,则当我将此行的可见性设置为 时,高度不会变为零(因此不会显示此行)Collapsed。例如,如果我将网格行高设置为 as *,然后设置 as 的可见性ScrollViewerCollapsedScrollViewer不会显示 ,但仍然有一个空白空间对应于一颗星的高度。
  2. 正如我所提到的,我至少有 3 个选项/不同的观点。因此,从 bool 属性到可见性的绑定是不够的。我想我可以制作一个专用转换器,但感觉不够通用。

谁能告诉我,如何实现我的目标,即根据用户的选择使用一个 UserControl(所有绑定到同一个 ViewModel)显示不同的 UI 部分?

4

1 回答 1

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;
    }
}

当然,这假设您知道如何将Converterwith XML 命名空间添加到您的 XAML 中,并且您的enum属性已命名EnumIntance,您的enum值已命名Option1Option2并且Option3

我还没有能够测试这个,所以让我知道它是否有任何问题

于 2013-10-21T08:36:26.697 回答