왜 이래?
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 : (시작 창 /보기 설정)
<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 : (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>
기본적으로 "View as DataTemplate"(VaD) 대 "View as Window"(VaW)입니다.
비교에 대한 나의 이해는 다음과 같습니다.
- VaD : 창을 닫지 않고 뷰를 전환 할 수 있습니다. (이것은 내 프로젝트에 바람직하지 않습니다)
- VaD : VM은 뷰에 대해 전혀 알지 못하지만 VaW에서는 다른 창을 열 때만 인스턴스화 할 수 있어야합니다.
- VaW : 실제로 디자이너에서 xaml이 렌더링되는 것을 볼 수 있습니다 (적어도 현재 설정에서는 VaD를 사용할 수 없습니다).
- VaW : 창을 열고 닫을 때 직관적으로 작동합니다. 각 창에는 해당 View (및 ViewModel)가 있습니다.
- VaD : ViewModel은 속성을 통해 초기 창 너비, 높이, 크기 조정 가능성 등을 전달할 수 있습니다 (VaW에서는 창에서 직접 설정 됨).
- VaW : FocusManager.FocusedElement를 설정할 수 있습니다 (VaD에서 방법이 확실하지 않음).
- VaW : 내 창 유형 (예 : 리본, 대화 상자)이 뷰에 통합되므로 파일이 적습니다.
그래서 여기서 무슨 일이 일어나고 있습니까? XAML로 창을 빌드하고 VM의 속성을 통해 데이터에 깔끔하게 액세스 한 다음 작업을 수행 할 수는 없나요? 코드 숨김은 동일합니다 (거의 없음).
모든 View 항목을 ResourceDictionary로 섞어 야하는 이유를 이해하는 데 어려움을 겪고 있습니다.