Wpf MVVM与修改视图的可能性之间是否存在不匹配';s组件树?

Wpf MVVM与修改视图的可能性之间是否存在不匹配';s组件树?,wpf,silverlight,mvvm,Wpf,Silverlight,Mvvm,阅读了所有关于Model View ViewModel architecture的StackOverflow条目以及网络上大多数现成的资源后,我得出结论,它是构建可靠Silverlight应用程序的事实标准。 我开始使用这个架构规划我的下一个应用程序。应用程序的需求之一是构建或更改可视化组件结构。例如,响应用户交互,我希望在编译时以编程方式将未知数量的矩形和椭圆附加到特定画布上。 我开始绞尽脑汁应用MVVM模式,并思考负责附加新组件的代码应该放在哪里。我得出结论,它不属于任何MVVM层,因此不可

阅读了所有关于Model View ViewModel architecture的StackOverflow条目以及网络上大多数现成的资源后,我得出结论,它是构建可靠Silverlight应用程序的事实标准。
我开始使用这个架构规划我的下一个应用程序。应用程序的需求之一是构建或更改可视化组件结构。例如,响应用户交互,我希望在编译时以编程方式将未知数量的矩形和椭圆附加到特定画布上。
我开始绞尽脑汁应用MVVM模式,并思考负责附加新组件的代码应该放在哪里。我得出结论,它不属于任何MVVM层,因此不可能在场景中应用此体系结构,因为您必须在运行时操作组件树。

有没有办法在这种场景中仍然使用模型-视图-视图-模型,或者仅限于使用固定视图组件结构?

不要操作组件树。相反,操作表示组件树的模型。然后将视图绑定到该模型中的各种集合和属性,以生成其视觉效果

下面是一个非常简单的例子它只显示了概念-请不要将其视为您应该如何考虑代码的指示。

首先,我的模型:

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>

您的问题的基本问题是将用户的需求(操作由矩形和椭圆表示的对象(我只是猜测))与实现细节(将
矩形和
椭圆添加到
画布
es)混淆

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

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

这将是实际的Silverlight组件(
矩形
椭圆
画布
)绑定到它们的
数据上下文
,并具有一些非常小的事件处理程序或
命令
或其他内容

模型 以特定于域的方式保存数据和业务逻辑

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

视图模型 以面向用户界面且通常是特定于用例的方式优化模型

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


请阅读我的博客。

Jep。Binding应该是你唯一的朋友谢谢你Kent。这是我一直在寻找的答案。MVVM在WPF中比Silverlight容易得多。例如,Silverlight中的DataTemplates不支持DataType属性。@David感谢您的分享和解释。如果有什么区别的话,MVVM实际上是您项目的一种高级模式,因为它允许您通过简单地使用中间层(ViewModel)在UI(视图)中抽象地表示数据(模型)转换为查看友好的集合和属性,并使用数据模板直观地构造它们。