发送UserControl到视图以动态显示

本文关键字:动态显示 视图 UserControl 发送 | 更新日期: 2023-09-27 18:02:00

我正在第一次尝试WPF和MVVM。我需要一个用户控件作为一个伪对话框——它在应用程序的部分(一个选项卡)上"对话",但允许用户仍然切换到应用程序的其他区域。

我正试图通过我的TabDialog UserControl来实现这一点。目前它看起来像:

<Grid
     Visibility="{Binding ShowAvailable, Converter={StaticResource BoolToVis}}">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel
        Grid.Row="0"
        Grid.Column="0"
        Grid.RowSpan="3"
        Grid.ColumnSpan="3"
        Background="black"
        Opacity=".5"
        />
    <Label Background="Red" 
           Grid.Row="1"
           Grid.Column="1"
           Content="{Binding ShowAvailable}"></Label>
</Grid>

其中ShowAvailable是父代DataContext上的Bool,并在此控制中继承。

我现在的问题是,因为我想重用这个控件不同的"对话框"视图,我想通过它应该显示的视图(将取代Label)。我如何发送一个由父视图模型定义的用户控件到这个视图,并显示它?

谢谢你的指导。

发送UserControl到视图以动态显示

这可以通过datatemplate和ContentControls来实现。由于Content控件没有指定ContentTemplate,因此它通过绑定到的视图模型的类型来确定哪个DataTemplate。因此,要更改正在使用的视图,只需更改绑定到的对象的类型。

<Grid Visibility="{Binding ShowAvailable, Converter={StaticResource BoolToVis}}">
    <Grid.Resources>
        <DataTemplate DataType="LabelViewModel">
            <wpfApplication1:MyUserControl />
        </DataTemplate>
        <DataTemplate DataType="NonLabelViewModel">
            <wpfApplication1:OtherUserControl />
        </DataTemplate>
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel
    Grid.Row="0"
    Grid.Column="0"
    Grid.RowSpan="3"
    Grid.ColumnSpan="3"
    Background="black"
    Opacity=".5"
    />
    <ContentControl Content="{Binding ViewModelObject}" />
</Grid>

LabelViewModel和NonLabelViewModel将是您要定义的ViewModels,(并作为名为ViewModelObject的属性添加到网格绑定的父视图模型中)和MyUserControl和OtherUserControl将是用户控件容纳UI,应该对应于这些ViewModel类型。