MVVM-шаблон для WPF-приложения, подобного Paint?

StackOverflow https://stackoverflow.com/questions/975602

  •  13-09-2019
  •  | 
  •  

Вопрос

Сейчас я нахожусь на этапе планирования своего проекта.

Я подумал об использовании шаблона MVVM для своего приложения для обеспечения тестируемости, удобства обслуживания и т. д.Я только начал разбираться в MVVM, но есть одна вещь, которую я просто не могу понять в контексте моего запланированного приложения.

Мое приложение призвано помочь спортивным тренерам в планировании тренировок, позволяя им визуально фиксировать упражнения.Это своего рода краска для спортивных тренеров.

Я уже думал о том, как реализовать различные PaintObjects (так я их называю) для своего приложения (например:Ball, Player и т. д.) и нашли наиболее удобный способ сделать это — написать класс с несколькими DependencyProperties и затем предоставить XAML-ControlTemplate для этого класса.

Теперь, когда я думаю о структурировании экрана рисования моего приложения, я решил использовать что-то вроде PaintView.xaml с PaintViewModel.cs.Теперь вопрос в том, как PaintViewModel хранит объекты PaintObjects?Что такое PaintObjects?Являются ли они сами ViewModels?Они модели?Это просмотры?

Это та часть, где я полностью застрял в своих размышлениях и надеюсь получить совет от более опытных пользователей MVVM.Заранее спасибо!

С уважением, Кришу

Это было полезно?

Решение

Сохраняйте разделение между вашими виртуальными машинами (что должны быть POCO) и просмотры.Ваши виртуальные машины не должны сильно зависеть от ваших представлений, поскольку это затрудняет их изолированное тестирование.

Судя по всему, вам понадобится что-то в вашей виртуальной машине для представления различных фрагментов ваших сцен (BallViewModel, PlayerViewModel и так далее).Они могут быть открыты из-за SceneViewModel:

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

    ...
}

public abstract class SceneObjectViewModel : ViewModel
{
    ...
}

public class BallViewModel : SceneObjectViewModel
{
    ...
}

Тогда ваш 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>

Приведенный выше XAML предполагает, что ваш DataTemplateопределены в другом месте, и что каждый SceneObjectViewModel имеет Top и Left свойство.

Другие советы

Привет, попробуй посмотреть этоРуководство по составному приложению для WPF и Silverlight

Внутри него есть MVVM, а также некоторые другие...может помочь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top