C# 从父视图模型派生的空视图模型是否存在问题?WPF

C# 从父视图模型派生的空视图模型是否存在问题?WPF,c#,wpf,mvvm,C#,Wpf,Mvvm,我设计了两个用户控件,一个用于指向左侧的“信号”,另一个用于指向右侧的“信号”。由于它们都有相似的功能,我为它们设计了一个基本视图模型,并创建了两个可以绑定的独立视图模型 My BaseSignalViewModel,它也继承自实现INotifyPropertyChanged的父视图模型 public class BaseSignalViewModel : RailwayViewModel { private Signal _signal; private Lin

我设计了两个用户控件,一个用于指向左侧的“信号”,另一个用于指向右侧的“信号”。由于它们都有相似的功能,我为它们设计了一个基本视图模型,并创建了两个可以绑定的独立视图模型

My BaseSignalViewModel,它也继承自实现INotifyPropertyChanged的父视图模型

public class BaseSignalViewModel : RailwayViewModel {
        private Signal _signal;
        private LineCoordinates _segment;
        private decimal _signalPos;
        private PointCoordinates _signalCoords;

        public PointCoordinates SignalCoords {
            get => _signalCoords;
            set {
                _signalCoords = value;
                OnPropertyChanged("SignalCoords");
            }
        }


    //There's more logic that isn't relevent to this question
}

我的信号的左视图和右视图模型,均为空

public class SignalLeftViewModel : BaseSignalViewModel {
        public SignalLeftViewModel(Signal signal) : base(signal) {

        }


}

public class SignalRightViewModel : BaseSignalViewModel {
        public SignalRightViewModel(Signal signal) : base(signal) {

        }


}
在我的XAML中,我被绑定在一个列表中,然后绑定到特定的视图模型,这样我就知道要绘制哪个用户控件

<DataTemplate DataType="{x:Type viewModel:SignalLeftViewModel}">
                            <Canvas>
                                <userControls:SignalLeftControl SignalName="{Binding Name}" Canvas.Top="{Binding SignalCoords.Y, Converter={StaticResource ScaleYCoordConverter},ConverterParameter=leftSignal}" Canvas.Left="{Binding SignalCoords.X, Converter={StaticResource ScaleXCoordConverter}, ConverterParameter=leftSignal}">
                                    <userControls:SignalLeftControl.RenderTransform>
                                        <RotateTransform Angle="{Binding Angle}"/>
                                    </userControls:SignalLeftControl.RenderTransform>
                                </userControls:SignalLeftControl>

                            </Canvas>
                        </DataTemplate>
                        <DataTemplate DataType="{x:Type viewModel:SignalRightViewModel}">
                            <Canvas>
                                <userControls:SignalRightControl SignalName="{Binding Name}" Canvas.Top="{Binding SignalCoords.Y, Converter={StaticResource ScaleYCoordConverter},ConverterParameter=rightSignal}" Canvas.Left="{Binding SignalCoords.X, Converter={StaticResource ScaleXCoordConverter}, ConverterParameter=rightSignal}">
                                    <userControls:SignalRightControl.RenderTransform >
                                        <RotateTransform Angle="{Binding Angle}"/>

                                    </userControls:SignalRightControl.RenderTransform>
                                </userControls:SignalRightControl>

                                <!--<Ellipse Width="2" Height="2" Fill="Red" Canvas.Top="{Binding SignalCoords.Y, Converter={StaticResource ScaleYCoordConverter}}" Canvas.Left="{Binding SignalCoords.X, Converter={StaticResource ScaleXCoordConverter}}" ></Ellipse>-->
                            </Canvas>
                        </DataTemplate>


我的问题是这样做是否可以,比如为了能够告诉我需要绘制哪个用户控件而使用空视图模型?提前感谢您,请询问是否有任何需要澄清的地方。

另一种方法可能是在
BaseSignalViewModel
上为左侧或右侧设置一个属性,可能为此使用
enum
。然后,您可以使用一个
DataTemplateSelector
类,该类根据该属性返回相应的模板。

我认为这两个示例没有问题。如果你开始得到很多空的虚拟机,我可能会像Chris所描述的那样切换到DataTemplateSelector。谢谢Chris,我现在将研究如何实现这一点,看起来这可能会奏效。你甚至可能不需要DataTemplateSelector。相反,通过ContentControl/Presenter样式的DataTrigger(例如ItemsControl的ItemContainerStyle),将ContentControl或ContentPresenter的ContentTemplate属性设置为所需的DataTemplate。