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