У меня вопрос о 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();
}
}
Когда вы можете сделать это следующим образом:?
App.xaml: (Установить начальное окно /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 Window not 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" (VaD) и "Просмотр как окно" (VaW)
Вот мое понимание сравнения: (Примечание: я использую VS 2008, поэтому мне не хватает Blendability &/или другого материала)
- VaD: позволяет переключать виды, не закрывая окно. (Это нежелательно для моего проекта)
- VaD: VM ничего не знает о представлении, тогда как в VaW он (только) должен иметь возможность создавать экземпляр при открытии другого окна
- VaW: Я действительно вижу, что мой xaml отображается в Дизайнере (я не могу с VaD, по крайней мере, в моей текущей настройке)
- VaW: работает интуитивно с открытие и закрытие окон; каждое окно имеет (есть) соответствующий вид (и ViewModel)
- VaD: ViewModel может передавать начальную ширину окна, высоту, изменяемость и т.д. через свойства (тогда как в VaW они непосредственно устанавливаются в окне)
- VaW: Можно установить FocusManager.FocusedElement(не уверен, как в VaD)
- VaW: Меньше файлов, так как мои типы окон (например, Ribbon, Dialog) включены в их представления
Итак, что здесь происходит? Не могу ли я просто создать свои окна в XAML, получить доступ к их данным по свойствам виртуальной машины и сделать с ними? Кодировка - то же самое (фактически ноль). Я пытаюсь понять, почему я должен перетасовать все материалы View в ResourceDictionary. (Но я не хочу делать это неправильно;-))
Это даже имеет значение? Есть что-то, что я пропустил? Большое спасибо за чтение.: О
Спасибо Рейчел Лим и Ник Поляк за мое расцветное понимание MVVM
Изменить: незначительное изменение потока