使用MVVM和WPF实现真实的可视化

使用MVVM和WPF实现真实的可视化,wpf,mvvm,data-visualization,Wpf,Mvvm,Data Visualization,我目前需要创建一个渡轮系统的可视化表示,显示实际渡轮在海上的位置和货物状态。渡轮上有卡车,卡车上有汽车。我需要在甲板上显示实际卡车及其xy位置。当渡轮装载时,卡车的位置会频繁更新,因此看起来很生动。我还需要在卡车上显示实际的汽车。卡车、汽车和渡轮也需要显示一些状态。因此,我有一个层次结构的数据,我需要可视化在一个相当现实的方式 在WPF中实现这种东西的好方法是什么?我是否应该将MVVM与一个TreeView控件一起使用,并为sea、ferry、truck和car创建一个HierarchycalD

我目前需要创建一个渡轮系统的可视化表示,显示实际渡轮在海上的位置和货物状态。渡轮上有卡车,卡车上有汽车。我需要在甲板上显示实际卡车及其xy位置。当渡轮装载时,卡车的位置会频繁更新,因此看起来很生动。我还需要在卡车上显示实际的汽车。卡车、汽车和渡轮也需要显示一些状态。因此,我有一个层次结构的数据,我需要可视化在一个相当现实的方式


在WPF中实现这种东西的好方法是什么?我是否应该将MVVM与一个TreeView控件一起使用,并为sea、ferry、truck和car创建一个HierarchycalDataTemplates,为TreeView创建一个ControlTemplate?或者我应该更好地使用UserControls并在代码中组合和更新它们,而不是将它们数据绑定到ViewModel的可观察集合。你有这方面的经验吗?你会怎么做?你能画出类/控件设置的草图吗?

WPF在视图模型中非常有效。如果您可以将代码隐藏到特定需要时,那么您就可以更轻松地将ui与数据分离。如果数据模型在不同的显示之间不发生变化,它将使您的用户界面更易于升级。

WPF与视图模型配合得非常好。如果您可以将代码隐藏到特定需要时,那么您就可以更轻松地将ui与数据分离。如果数据模型在不同的显示之间不发生变化,它将允许用户界面更易于升级。

我建议使用一个用户控件来处理所有图形。否则,您可能会丢失对象的层次结构。汽车、卡车和渡轮上的人说,如果再加上一个项目,也会更容易

如果您的模型是分层的,那么您可以将顶层传入控件,让控件自行排序


MVVM对现有控件很有效,但现有WPF控件只有在有一个接近您需要的控件时才有效,只需稍加调整即可。我想不出WPF中有哪一个标准控件能满足您的需要,所以现在是编写新控件的时候了。

我建议使用一个用户控件来处理所有图形。否则,您可能会丢失对象的层次结构。汽车、卡车和渡轮上的人说,如果再加上一个项目,也会更容易

如果您的模型是分层的,那么您可以将顶层传入控件,让控件自行排序

MVVM对现有控件很有效,但现有WPF控件只有在有一个接近您需要的控件时才有效,只需稍加调整即可。我想不出WPF中的标准控件能满足您的需要,所以现在是编写新控件的时候了。

我建议使用“无外观”控件,而不是使用用户控件。通常我使用用户控件作为我的lookless控件的粘合剂/容器。无外观控件的一个示例是Button类。它包含一个默认样式,在混合中,您可以随意修改样式。它还支持可视状态管理器,因此您可以在状态更改时更改演示文稿的外观。您可以将无外观控件的代码隐藏视为迷你ViewModel。在这里,可以混合一些表示材料和域类

如果遵循相同的设计,则可以创建一个Ferry外观控件。这个控件将有一组它自己的依赖属性(可能监听DP的OnChange)

您的渡轮控制可能有一个称为“卡车”的可观察收集DP

然后在Themes\generic.xaml中,为Ferry控件创建默认样式。您的默认样式可能有一个带有ItemsSource={TemplateBinding}的ItemsControl。ItemsControl面板模板可以是您自己用于安排卡车的自定义面板,也可以使用画布。对于ItemsControl items模板,您将有如下内容:

<DataTemplate>
     <mynamespace:TruckControl/>
</DataTemplate>

卡车控件也是一个无外观控件,具有自己的默认样式,并且它的数据上下文已经设置好,因此可以直接执行{Binding Path=xyz}。卡车控件还可以设置其Canvas.Left/Top(如果您选择在pervious items控件中使用画布..或者如果您为其制作了自定义面板,则可能根本不设置其位置)或渲染变换以将其放置在正确的X,Y.您还可以使用卡车模板中的items控件以与在ferry控件中渲染卡车相同的方式渲染汽车。还可以为VisualStateManager创建状态,以使其完全可支持。因此,如果一辆卡车进入“问题状态”,你可以很容易地在混合中设置该状态的样式,使其闪烁红色,例如

我知道这听起来很难理解,但最终拥有所有支持MVVM模型的可设置样式的控件将使您的生活更加轻松

我建议学习微软的silverlight工具包,了解如何实现无外观控件等。试着看一个简单的控件,比如DatePicker(),其中一个警告是ignore DatePicker.xaml文件(它只是generic.xaml中的镜像,如果删除它,就不会有什么不好的事情发生)

您应该密切注意的事项有:

1.)类上的属性。这些帮助你知道如何处理你的控制

2.)OnApplyTemplate覆盖。在这里,您可以从模板中提取特定元素。这些称为“零件”,您将在Blend中看到零件选项卡。#1中的属性可以定义模板中的“部件”以及预期的类型

3.)构造函数中的DefaultStyleKey=typeof(…)。这将告诉Silverlight什么是默认模板