类似Paint的WPF应用程序的MVVM模式?

chr*_*chu 3 wpf paint mvvm

我目前正处于我的一个项目的规划阶段.

我考虑过将MVVM模式用于我的应用程序,以实现可测试性,可维护性等.我只是开始关注MVVM,但有一点我在计划的应用程序的上下文中无法弄清楚.

我的申请旨在通过允许他们在视觉上捕捉锻炼来帮助体育教练进行锻炼计划.这是一种体育训练师的油漆.

我已经想过如何实现不同PaintObjects(这就是我给他们打电话)我的应用程序(例如:球,播放器等),并已经找到了最方便的方式来做到这一点是写一个类与多家DependencyProperties和然后为这个类提供XAML-ControlTemplate.

现在,当我考虑构建应用程序的绘制屏幕时,我想我会使用PaintView.xaml和PaintViewModel.cs之类的东西.现在的问题是PaintViewModel如何存储PaintObjects?什么是PaintObjects呢?他们是ViewModels吗?他们是模特吗?他们有意见吗?

这是我完全陷入困境的一部分,并希望得到更有经验的MVVM用户的一些建议.提前致谢!

最好的问候,crischu

Ken*_*art 6

保持VM(应该是POCO)和视图之间的分离.您的VM不应该对您的视图具有硬依赖性,因为这使得难以单独测试它们.

因此,通过它的声音,你需要在你的虚拟机的东西来代表您的场景(不同的点点滴滴BallViewModel,PlayerViewModel等等).这些可能会暴露出来SceneViewModel:

public class SceneViewModel : ViewModel
{
    public ICollection<SceneObjectViewModel> SceneObjects
    {
        get { ... }
    }

    ...
}

public abstract class SceneObjectViewModel : ViewModel
{
    ...
}

public class BallViewModel : SceneObjectViewModel
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后你SceneView将绑定到该集合并使用以下内容呈现每个项目DataTemplate:

<ItemsControl ItemsSource="{Binding SceneObjects}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Canvas.Top" Value="{Binding Top}"/>
            <Setter Property="Canvas.Left" Value="{Binding Left}"/>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

上述XAML假定您DataTemplates的其他地方定义,并且每个SceneObjectViewModelTopLeft财产.