阅读了有关Model-View-ViewModel 架构的所有 StackOverflow 条目以及网络上大多数现成的资源后,我得出的结论是,它是构建SOLID Silverlight 应用程序的事实标准。
我开始使用这种架构来计划我的下一个应用程序。应用程序的要求之一是构建或更改可视组件结构。例如,响应用户交互,我想以编程方式将编译时未知数量的矩形和椭圆附加到特定的画布或画布上。
我开始扭曲我的想法来应用 MVVM 模式,并思考负责附加新组件的代码应该去哪里。我得出的结论是,它不属于任何 MVVM 层,因此不可能在必须在运行时操作组件树的场景中应用此架构。
有没有办法在这些场景中仍然使用Model-View-ViewModel或者它仅限于使用固定的 View 组件结构?
Przemek
问问题
816 次
2 回答
8
不要操纵组件树。相反,操作代表组件树的模型。然后让您的视图绑定到该模型中的各种集合和属性以生成其视觉效果。
下面是一个非常简化的示例。它只是显示概念 - 请不要将其视为您应该如何分解代码的指示。
首先,我的模型:
public abstract class Shape
{
public double Left { get; set; }
public double Top { get; set; }
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
}
接下来,我公开了一个上述形状的集合(您将使用另一个模型来包含该集合)。然后我在我看来绑定到它:
<Window x:Name="_root" x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<DataTemplate DataType="{x:Type local:Rectangle}">
<Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="Black"/>
</DataTemplate>
</Window.Resources>
<ItemsControl DataContext="{Binding ElementName=_root}" ItemsSource="{Binding Shapes}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Canvas.Left" Value="{Binding Left}"/>
<Setter Property="Canvas.Top" Value="{Binding Top}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</Window>
于 2009-02-27T09:21:24.393 回答
2
您问题中的基本问题是混淆了用户的需求(操作由矩形和椭圆表示的对象(我只是在猜测))与实现细节(将Rectangle
s 和Ellipse
s 附加到Canvas
es)。
同样,MVVM 模式中的不同职责:
看法
将 ViewModel 转换为像素,并将输入事件转换为 ViewModel 上的方法调用。
这将是与它们绑定的实际 Silverlight 组件 ( Rectangle
, Ellipse
, )并具有一些非常小的事件处理程序或s 或其他。Canvas
DataContext
Command
模型
以特定领域的方式保存数据和业务逻辑。
这表示您的用户正在绘制的“数学”矩形和椭圆。
视图模型
以面向 UI 且通常特定于用例的方式优化模型。
在这里,您存储与特定视图相关但不是基础模型概念的属性的瞬态信息,例如“当前选定的对象”。
阅读我的博客,了解我对 MVVM 的更多看法。
于 2009-02-27T09:53:48.247 回答