【问题标题】:Is there a problem with having empty ViewModels that derive from a parent view model? WPF从父视图模型派生的空视图模型是否存在问题? WPF
【发布时间】: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。

标签: c# wpf mvvm


【解决方案1】:

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

【讨论】:

  • 谢谢 Chris,我现在研究一下如何实现它,看来它可以解决问题。
  • 您甚至可能不需要 DataTemplateSelector。相反,通过 ContentControl/Presenter 样式(例如 ItemsControl 的 ItemContainerStyle)中的 DataTrigger 将 ContentControl 或 ContentPresenter 的 ContentTemplate 属性设置为所需的 DataTemplate。
猜你喜欢
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
相关资源
最近更新 更多