我正在设计一个WPF UserControl,它需要根据用户的选择显示不同的组件。但由于这个UserControl仍然相对简单,我决定只有一个View(这个UserControl)和一个ViewModel。基本上我所拥有的是一个组合框,它具有枚举值选项(至少三个选项),以指示用户想要看到的特定部分。对于单个组件,我现在设计的是,我有一个Grid
多个GridRow
。并且只有表示用户选择数据的行的可见性为Visible
。其他行/视图的可见性为Collapsed
。但有两个问题:
ScrollViewer
。就我而言
已经了解到,我无法设置GridRow的高度所在
ScrollViewer
位于Auto
。因为滚动条会
从不使用Auto
(因为实际高度足以显示所有高度,因此不需要滚动条)。但是,如果我没有将高度设置为
Auto
,高度不会变为零(所以这一行不会
当我将此行的可见性设置为Collapsed
时。对于
例如,如果我将网格行高度设置为*
,然后将可见性设置为ScrollViewer
作为Collapsed
的{{1}},ScrollViewer
不会
显示但仍有一个空格对应一个空格
明星的身高。任何人都可以告诉我,我如何实现我的目标,即根据用户的选择,使用一个UserControl(所有绑定到同一个ViewModel)显示不同的UI部分?
答案 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
属性的名称为EnumIntance
和enum
值名为Option1
,Option2
和Option3
。
我无法对此进行测试,所以如果有任何问题请告诉我