MVVM-шаблон для WPF-приложения, подобного Paint?
Вопрос
Сейчас я нахожусь на этапе планирования своего проекта.
Я подумал об использовании шаблона 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, а также некоторые другие...может помочь.