MVVM与修改View组件树的可能性之间是否存在不匹配?

时间:2009-02-27 09:16:42

标签: wpf silverlight mvvm

阅读了有关模型 - 视图 - 视图模型架构的所有StackOverflow条目以及网上大部分现有资源后,我得出的结论是它是构建事实上的标准 SOLID Silverlight应用。
我开始使用这种架构来规划我的下一个应用程序。该应用程序的要求之一是构建或更改可视组件结构。例如,响应用户交互,我想以编程方式将未知的编译时数量的矩形和椭圆附加到特定的Canvas或Canvases。
我开始扭曲我的想法来应用MVVM模式,并考虑负责连接新组件的代码应该去哪里。我得出结论,它不属于任何MVVM层,因此不可能在需要在运行时操作组件树的情况下应用这种架构。
有没有办法在这些风格中使用 Model-View-ViewModel ,或者仅限于使用固定的View组件结构?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

你问题中的根本问题是混淆了你的用户的需求(操纵由矩形和椭圆表示的对象(我只是猜测))和实现细节(附加RectangleEllipse s到Canvas es)。

同样,MVVM模式中的不同职责:

视图

将ViewModel转换为像素,并将输入事件转换为ViewModel上的方法调用。

这将是实际的Silverlight组件(RectangleEllipseCanvas)绑定到他们的DataContext并拥有一些非常小的事件处理程序或{{1}不管怎样。

模型

以特定领域的方式保存数据和业务逻辑。

这表示用户正在绘制的“数学”矩形和椭圆。

视图模型

以面向UI并且通常以特定于用例的方式优化模型。

在这里,您可以存储与特定视图相关但不是基础模型概念属性的“当前所选对象”等瞬态信息。

阅读我的博客more on my views on MVVM