Wpf 基于用户';s选项(或根据选择显示不同UI组件的其他选项)

Wpf 基于用户';s选项(或根据选择显示不同UI组件的其他选项),wpf,xaml,mvvm,user-controls,Wpf,Xaml,Mvvm,User Controls,我正在设计一个WPF用户控件,它需要根据用户的选择显示不同的组件。但是由于这个用户控件仍然相对简单,所以我决定只有一个视图(这个用户控件)和一个ViewModel。因此,基本上我有一个组合框,其中包含枚举值选项(至少三个选项),以指示用户希望看到的特定部分。对于单个组件,我现在设计的是,我有一个Grid和多个GridRow。并且只有表示用户选择数据的行才具有可视性,即可见。其他行/视图的可见性为折叠。但有两个问题: 在一个网格行中,我有一个ScrollViewer。据我所知 我已经学会了,我不能

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

  • 在一个网格行中,我有一个
    ScrollViewer
    。据我所知 我已经学会了,我不能设置网格的高度
    ScrollViewer
    位于as
    Auto
    中。因为滚动条会 切勿使用
    Auto
    (因为实际高度足够大,可以显示所有内容,因此无需滚动条)。但是,如果我不将高度设置为
    Auto
    ,高度将不会变为零(因此此行将不会为零) 显示)当我将此行的可见性设置为
    折叠时。对于
    例如,如果我将网格行高度设置为
    *
    ,然后设置可见性 当
    滚动查看器
    折叠时,
    滚动查看器
    将不会 已显示,但仍有一个空空间对应于一个 星星的高度
  • 正如我提到的,我至少有3个选项/不同的视图。因此,从bool属性到可见性的绑定是不够的。我想我可以做一个专用的转换器,但感觉不够通用

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

    您只需将每个“视图”放入自己的
    网格
    ,并创建一个
    枚举可见性转换程序
    ,以交替它们的
    可见性

    XAML:

    当然,这假定您知道如何将带有XML命名空间的
    转换器
    添加到XAML中,并且
    enum
    属性名为
    enuminance
    ,而
    enum
    值名为
    Option1
    Option2
    Option3

    我还不能测试这个,所以如果有任何问题,请告诉我


    我们最近有一个over@的链接(向下滚动阅读Reed Copsey的摘要,或向上滚动以了解更多关于具体案例的信息,链接指向使其工作的XAML),如果没有得到响应或有更多问题,请随时弹出(这不是真正的
    MVVM
    ,但如果您想使用该模式,我想您可能需要使用多个
    DataTemplates
    DataTypes
    ,如图所示)…@StefanDenchev感谢您的评论。我想这将解决我的第二个问题(尽管它需要一些UI和VM的扭曲,但不是什么大问题)但它并没有解决第一个问题:在可见性崩溃时使用自动使其消失,而不使用自动,因为ScrollViewer不会work@StefanDenchev关于使用
    DaTaTemplate
    ,我不知道如何在我的案例中使用它:不同的视图和它们背后的数据是完全不同的例如,在一个视图中,我有一个
    ObservableCollection
    ,我想以此为基础绘制多个图形。在另一个视图中,我想显示一个
    DataGrid
    ,以显示一些统计信息。因此在ViewModel中,我公开了两个属性,一个
    ObjectTypeA
    ObservableCollection
    ,一个
    List
    jectTypeB
    。我不知道如何使用
    DataTemplate
    来配置这些不同视图的可见性。我已经在更复杂的场景中使用了上述模式,虽然在这一场景中可能不可行,但我还没有深入研究……基本上,您可以使用itemscontrol并将content属性绑定到已选择-我们将其称为
    CurrentDT
    ,您可以对其进行操作(即根据用户的选择进行更改),然后使用适当的数据模板。感谢您的回答。我会在测试后立即更新结果。我认为此解决方案可行,因为它解决了我无法使用
    Auto
    作为高度的问题,因为它不适用于
    ScrollViewer
    。非常感谢!
    <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;
        }
    }