【发布时间】:2019-07-17 17:19:19
【问题描述】:
我设计了两个用户控件,一个用于“信号”指向左,一个用于“信号”指向右。由于它们都具有相似的功能,因此我为它们设计了一个基本视图模型,并创建了两个可以绑定的独立视图模型。
我的 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>
我的问题是这样做是否可行,例如为了能够判断我需要绘制哪个用户控件而使用空视图模型?提前谢谢你,如果有什么需要澄清的,请询问。
【问题讨论】:
-
我看不出这个只有两个的例子有什么问题。如果您开始获得大量空虚拟机,我可能会切换到 Chris 描述的 DataTemplateSelector。