4

我目前正在开发一个 C# WPF 应用程序,该应用程序允许您创建一个图形(即通过边连接的一堆顶点),然后使用这个图形作为模式在一堆其他(更大)图形中找到它( “主机”图)。每个图形元素至少有一个类型和一个标签。

模式图元素(边和顶点)可以有不同的“限制类型”。

例如,一个顶点可以有“这个顶点”标签必须是“顶点 A”或“这个顶点”类型必须在集合 {Type A,Type B,Type H} 中的限制。

对于边,限制类型有点困难。一条边可以被限制为“简单”边或“路径”边。模式图中两个顶点之间的路径边可以被认为是一个占位符,它允许您在宿主图中的两个顶点之间找到多个边(和顶点)。相比之下,简单边允许您在主机图中仅找到一条边(并且没有其他顶点)。

如果一条边有路径限制(而不是普通的边限制),它有一些附加属性,如最小路径长度或路径上允许的允许顶点类型。

类型限制结构可以在这个 UML 类图中看到: 图像1

~~~

现在从 UI 的角度来看:用户应该能够配置边缘是否有路径限制。如果有,用于附加设置的必要附加控件(文本框、列表框等)应自动出现。所有控件的更改都应自动反映在数据结构中。

以下是更改所选边缘的设置时用户界面的行为:( 图2 实际上,在右侧还应该有一个滚动条,允许您向下滚动并配置路径上允许的边缘类型. 也暂时忽略顶点和边缘重叠设置。)

~~~

最后,我的问题归结为:

如何在保持 WPF 的数据绑定优雅的同时实现这样的动态对象类更改?(通过动态对象类更改,我的意思是通过单击“将此边缘视为路径”复选框,所选边缘将获得不同的限制类型。)

我真的必须创建一个老式的事件侦听器,当更改“将此边缘视为路径”复选框的值并使用它“手动”更新其他侧边栏控件的可见性时触发?

如果我以某种方式改变了我的限制类结构,它会有什么帮助吗?

4

2 回答 2

3

Okay, I don't really speak design patterns, so I'm not answering in those terms. I do speak WPF though, and design patterns usually turn out to be something I'd already done but didn't know what it was called.

WPF doesn't really care what type anything is. If you're displaying it using a DataTemplate in a ContentControl of some sort you can have one for every type the object might actually be that needs special treatment and WPF will take care of that for you. A DataTemplateSelector might be a good idea for more complicated logic for choosing the UI pieces for a given type, which in my experience tends to happen in many supposedly simple scenarios that turn out not to be. The disadvantage is that a DataTemplateSelector has to know about all your data types and templates in order to be able to choose between them.

This only really works for the side panel though, the rendering of the actual graph probably needs to be done in a more holistic manner and is, I would say, a completely different problem.

于 2013-05-28T13:04:56.323 回答
3

您所追求的设计模式可能是MVVM。看起来您当前正在将您的 UI 直接附加到您的模型,而两者之间没有视图模型。有时你可以侥幸逃脱,有时则不行。

可以编写一个应用于IsChecked属性绑定的值转换器,将布尔值转换为限制类的正确实例并返回。随着复选框状态的变化,会创建一个不同的实例并将其分配到您的模型中。这将通过数据模板的选择反映在 UI 中。

它可能比这更复杂,例如,如果您想在状态更改之间保留值。这就是您想要在 UI 和模型之间引入视图模型的地方。视图模型紧密地反映了 UI 并具有相应的布尔属性,当它发生变化时,您可以相应地更改模型。

无论哪种方式,都没有理由挂钩控件上的事件:尝试在视图模型中处理这一切。

于 2013-05-28T13:43:58.067 回答