微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐