Wpf 基于用户';s选项(或根据选择显示不同UI组件的其他选项)
我正在设计一个WPF用户控件,它需要根据用户的选择显示不同的组件。但是由于这个用户控件仍然相对简单,所以我决定只有一个视图(这个用户控件)和一个ViewModel。因此,基本上我有一个组合框,其中包含枚举值选项(至少三个选项),以指示用户希望看到的特定部分。对于单个组件,我现在设计的是,我有一个Wpf 基于用户';s选项(或根据选择显示不同UI组件的其他选项),wpf,xaml,mvvm,user-controls,Wpf,Xaml,Mvvm,User Controls,我正在设计一个WPF用户控件,它需要根据用户的选择显示不同的组件。但是由于这个用户控件仍然相对简单,所以我决定只有一个视图(这个用户控件)和一个ViewModel。因此,基本上我有一个组合框,其中包含枚举值选项(至少三个选项),以指示用户希望看到的特定部分。对于单个组件,我现在设计的是,我有一个Grid和多个GridRow。并且只有表示用户选择数据的行才具有可视性,即可见。其他行/视图的可见性为折叠。但有两个问题: 在一个网格行中,我有一个ScrollViewer。据我所知 我已经学会了,我不能
Grid
和多个GridRow
。并且只有表示用户选择数据的行才具有可视性,即可见
。其他行/视图的可见性为折叠
。但有两个问题:
ScrollViewer
。据我所知
我已经学会了,我不能设置网格的高度
ScrollViewer
位于asAuto
中。因为滚动条会
切勿使用Auto
(因为实际高度足够大,可以显示所有内容,因此无需滚动条)。但是,如果我不将高度设置为
Auto
,高度将不会变为零(因此此行将不会为零)
显示)当我将此行的可见性设置为折叠时。对于
例如,如果我将网格行高度设置为*
,然后设置可见性
当滚动查看器
折叠时,滚动查看器
将不会
已显示,但仍有一个空空间对应于一个
星星的高度
有谁能告诉我,我如何才能实现我的目标,即根据用户的选择,使用一个用户控件显示不同的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;
}
}