WPF MVVM зачем использовать представления ContentControl + DataTemplate, а не прямые представления окна XAML?
у меня есть вопрос о MVVM в WPF, который сводит меня с ума.
зачем делать что-то вроде этого:?
MainWindow.xaml:
<Window x:Class="MVVMProject.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<ContentControl Content="{Binding}"/>
</Grid>
</Window>
есть ваш ExampleView.xaml настраивается как:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
<DataTemplate DataType="{x:Type vms:ExampleVM}" >
<Grid>
<ActualContent/>
</Grid>
</DataTemplate>
</ResourceDictionary>
и создать окно следующим образом:
public partial class App : Application {
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
MainWindow app = new MainWindow();
ExampleVM context = new ExampleVM();
app.DataContext = context;
app.Show();
}
}
когда вы можете сделать это такой:?
приложение.xaml: (Set startup window / View)
<Application x:Class="MVVMProject.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="ExampleView.xaml">
</Application>
ExampleView.xaml: (окно Не a ResourceDictionary)
<Window x:Class="MVVMProject.ExampleView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vms="clr-namespace:MVVMProject.ViewModels">
>
<Window.DataContext>
<vms:ExampleVM />
</Window.DataContext>
<Grid>
<ActualContent/>
</Grid>
</Window>
по сути, это "посмотреть как шаблон данных DataTemplate" (ВАД) и "окно" (НЖ)
вот мое понимание сравнения: (обратите внимание, что я использую VS 2008, поэтому мне не хватает Блендируемости и / или других вещей)
- VaD: позволяет переключать виды, не закрывая окно. (Это не желательно для моего проекта)
- VaD: VM абсолютно ничего не знает о представлении, тогда как в VaW он (только) должен уметь чтобы создать его при открытии другого окна
- VaW: я действительно вижу, как мой xaml отображается в конструкторе (я не могу
с VaD, по крайней мере, в моей текущей настройке) - НЖ: интуитивно понятный интерфейс с
Открытие и закрытие окон; каждое окно имеет (есть) соответствующий вид
(и ViewModel) - VaD: ViewModel может проходить по начальной ширине окна, высоте, изменяемости размера и т. д. через свойства (в то время как в VaW они устанавливаются непосредственно в окне)
- VaW: Можно установить FocusManager.FocusedElement (не уверен, как в VaD)
- VaW: меньше файлов, так как мои типы окон (например, Лента, Диалог) включены в их представления
так что же здесь происходит? Не могу ли я просто построить свои окна в XAML, получить доступ к их данным чисто через свойства виртуальной машины и покончить с этим? Код-за то же самое (практически ноль). Я изо всех сил пытаюсь понять, почему я должен перетасовать все материалы просмотра в ResourceDictionary.
(Но Я не хочу этого делать неправильно ; -))
это вообще имеет значение? Что-то я пропустил?
Большое спасибо за чтение. : O
спасибо Рэйчел Лим и Нику поляку за мое цветущее понимание MVVM
изменить: незначительное изменение потока
3 ответов:
люди используют
DataTemplatesтаким образом, когда они хотят динамически переключать представления в зависимости от ViewModel:<Window> <Window.Resources> <DataTemplate DataType="{x:Type local:VM1}"> <!-- View 1 Here --> </DataTemplate> <DataTemplate DataType="{x:Type local:VM2}"> <!-- View 2 here --> </DataTemplate> </Window.Resources> <ContentPresenter Content="{Binding}"/> </Window>и
если
Window.DataContextпримерVM1, потомView1будет отображаться,и если
Window.DataContextпримерVM2, потомView2будет отображаться.конечно, это не имеет никакого смысла вообще, если только 1 вид, и никогда не изменял.
Я надеюсь, это достаточно ясно : P
поскольку в VaD модели представления ничего не знают о представлениях, вы можете построить полностью функционирующее приложение, полностью состоящее только из моделей представления и без представлений. Это приводит к возможности написания приложения, которое может управляться полностью кодом. Это в свою очередь приводит к возможности выполнения интеграционного тестирования без GUI. Интеграционное тестирование через графический интерфейс, как известно, хрупкое - в то время как тестирование через модели представления должно быть более надежным.
из моего личного опыта: Обе модели работы являются aviables, в зависимости от того, что вы хотите, и в зависимости от требований приложения. Идея за
VaDдекопирование содержимого и контейнера. Если вы реализуетеVaDвы можете использовать этот шаблон (по умолчанию) когда вы показать любой элемент этого типа. Вы можете использовать его вItemsControls(списки, списки, сетки и т. д.) И вContentControlsтолько делая Привязок. Как ты и сказал,VaDработает для переключения содержимого окна с закрытие и открытие нового. Также вы можете определить вид с помощьюUserControls, то вы берете под свой контроль, если сфокусированные элементы, а также вы можете управлять кодом позади. Итак, ваш шаблон данных может быть следующим:<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vms="clr-namespace:MVVMProject.ViewModels"> <DataTemplate DataType="{x:Type vms:ExampleVM}" > <CustomUserControl A="{Binding A}" B="{Binding B}" DataContext="{Binding}" .../> </DataTemplate>Вы также в
UserControlможет установить свойства зависимостей, что облегчает работу, потому что позволяет привязки и развязки приложения.но, конечно, если ваше приложение не требует динамического переключения контента, его можно использовать
VaWдля главного окна, или любой другое окно. На самом деле, вы можете использовать какVaWиVaD. Этот последний может быть использован для внутренних элементов в приложении, которое не требует windows. Вы выбираете то, что лучше для вас, в зависимости от требований приложения и времени, доступного для разработки приложения. Надеюсь, что этот личный опыт поможет...
Comments