C# WPF MVVM,带有基类/派生类的数据模板

C# WPF MVVM,带有基类/派生类的数据模板,c#,wpf,xaml,inheritance,mvvm,C#,Wpf,Xaml,Inheritance,Mvvm,我想这样做: 我有一个基类VerticalConnectorViewModel和一个派生类StairViewModel。 我使用WPF数据模板来定义这些对象的视图。 例如,我的基类是这样分配的(在UserControl.Resources中): <!-- Define a data-template for the 'VerticalConnectorViewModel' class. This generates the UI for each node. --> <Data

我想这样做:

我有一个基类VerticalConnectorViewModel和一个派生类StairViewModel。 我使用WPF数据模板来定义这些对象的视图。 例如,我的基类是这样分配的(在UserControl.Resources中):

<!-- Define a data-template for the 'VerticalConnectorViewModel' class. This generates the UI for each node. -->
<DataTemplate DataType="{x:Type model:VerticalConnectorViewModel}">
    <network:VerticalConnectorView></network:VerticalConnectorView>
</DataTemplate>
<!-- Define a data-template for the 'StairsViewModel' class. This generates the UI for each node. -->
<DataTemplate DataType="{x:Type model:StairsViewModel}">
    <network:StairsView></network:StairsView>
</DataTemplate>

我创建了两个不同的用户控件,即“network:VerticalConnectorView”和“network:StairsView”。除了后者的一些附加元素外,这两个控件看起来都很相似

我的VerticalConnectorView.xaml文件看起来像这样(但我认为在这里并不重要):


有两个组合框元素。第一个让您选择“随机”、“楼梯”、“电梯”或“自动扶梯”。现在,我要做的是,如果选择“楼梯”,我想将我的ViewModel从VerticalConnectionViewModel更改为StairsViewModel(并让WPF使用另一个视图)

由于我对所有ViewModels使用集合,我已经尝试使用SelectionChanged事件删除旧的ViewModel并添加新的ViewModel(另一个类的实例),但这也不起作用


这是可能的还是我应该重新考虑我的方法?我知道我可以只使用一个类,并为不同的选定值更新UI,但我真的应该将所有可能的值添加到我的基类吗?例如,如果垂直连接器的类型设置为“电梯”,则使用楼梯类型属性是没有意义的,对吗?

如果我取消设置rstand正确,您希望根据用户选择更改所选对象的类型,对吗?即,您有一个绑定到UI的集合,默认情况下该集合的类型为model:VerticalConnectorViewModel,然后用户可以选择“楼梯”,然后该类型应更改为model:StairsViewModel视图的数据上下文为my ViewModel。视图为基于Datatemplate(第一个代码部分)编辑。在视图中,我可以更改“类型”,如果我选择“楼梯”我希望我的ViewModel更改为我的派生类,并看到视图得到更新,当用户更改为“楼梯”时,ViewModel可以在集合中的同一位置插入新条目,然后如果集合是observablecollection,它将自动更新视图上的绑定项,该绑定项将根据datat解析必须显示的内容谢谢,我会试试的!你能解决你的问题吗?
<UserControl x:Class="NetworkUI.VerticalConnectorView"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:network="clr-namespace:NetworkUI"
                     mc:Ignorable="d" 
                     d:DesignHeight="300" d:DesignWidth="300">
    <Grid IsSharedSizeScope="True">
        <StackPanel>
            <network:NodeView x:Name="nodeView"></network:NodeView>
            <Border Grid.Row="0" BorderBrush="Black" BorderThickness="1" Margin="0" SnapsToDevicePixels="True">
                <StackPanel Width="Auto" HorizontalAlignment="Stretch" >
                    <Grid Width="Auto" Height="Auto">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition SharedSizeGroup="sharedDescription" Width="Auto"></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <network:EditableTextBlock Grid.Column="0" Text="Type" FontSize="10" IsEditable="False"></network:EditableTextBlock>
                        <ComboBox Grid.Column="1" HorizontalAlignment="Stretch" SelectedItem="{Binding Type}" ItemsSource="{Binding TypeValues}"></ComboBox>
                    </Grid>
                </StackPanel>
            </Border>
            <Border Grid.Row="0" BorderBrush="Black" BorderThickness="1" Margin="0" SnapsToDevicePixels="True">
                <StackPanel Width="Auto" HorizontalAlignment="Stretch" >
                    <Grid Width="Auto" Height="Auto">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition SharedSizeGroup="sharedDescription" Width="Auto"></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <network:EditableTextBlock Grid.Column="0" Text="Placement" FontSize="10" IsEditable="False"></network:EditableTextBlock>
                        <ComboBox Grid.Column="1" HorizontalAlignment="Stretch" SelectedItem="{Binding Placement}" ItemsSource="{Binding PlacementValues}"></ComboBox>
                    </Grid>
                </StackPanel>
            </Border>
        </StackPanel>
    </Grid>
</UserControl>