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

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

以下是一个非常简化的例子.它只是显示了这些概念 – 请不要将其视为您应该如何考虑代码的指示.

首先,我的模型:

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>
相关文章
相关标签/搜索