WPF MVVM 컨텐츠 제어 + 데이터를 사용하는 이유직선 XAML 창 보기가 아닌 템플릿 보기?
왜 그럴까요?
주 창.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>
예제View.xaml: (리소스 사전이 아닌 창)
<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>
기본적으로 "데이터 템플릿으로 보기"(VaD)와 "창으로 보기"(VaW)입니다.
비교에 대한 저의 이해는 다음과 같습니다.
- VaD: 창을 닫지 않고 보기를 전환할 수 있습니다.(이것은 내 프로젝트에 바람직하지 않습니다)
- VaD: VM는 View에 대해 전혀 알지 못하지만 VaWit에서는 다른 창을 열 때 이를 인스턴스화할 수 있어야 합니다.
- VaW: 디자이너에서 렌더링된 샘플을 실제로 볼 수 있습니다(최소한 현재 설정에서는 VaD를 사용할 수 없습니다).
- VaW: 창을 열고 닫는 작업을 직관적으로 수행합니다. 각 창에는 해당 보기(및 보기 모델)가 있습니다.
- VaD: ViewModel은 초기 창 너비, 높이, 크기 조정 등을 속성을 통해 전달할 수 있습니다(VaW에서는 창에 직접 설정됨).
- VaW: FocusManager를 설정할 수 있습니다.초점 요소(VaD에서의 방식은 확실하지 않음)
- VaW: 내 창 유형(예: 리본, 대화 상자)이 보기에 통합되므로 파일 수가 줄어듭니다.
그래서 무슨일이야?XAML에서 윈도우를 구축하고 VM 속성을 통해 해당 데이터에 액세스한 후 이를 완료할 수는 없습니까?코드백은 동일합니다(사실상 0).
보기 항목을 모두 리소스 사전에 섞어야 하는 이유를 이해하기 위해 고심하고 있습니다.
사용자DataTemplates
View Model에 따라 View를 동적으로 전환하려는 경우에는 다음과 같이 설정할 수 있습니다.
<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개의 보기만 필요하고 변경되지 않는 경우에는 전혀 의미가 없습니다.
VaD에서는 뷰 모델이 뷰에 대해 아무것도 모르기 때문에 뷰 모델만으로 완전히 구성된 완벽하게 작동하는 애플리케이션을 구축할 수 있습니다.이는 전적으로 코드로 구동될 수 있는 응용 프로그램을 작성할 수 있는 가능성으로 이어집니다.따라서 GUI 없이 통합 테스트를 수행할 수 있습니다.GUI를 통한 통합 테스트는 취약하기로 악명 높은 반면 뷰 모델을 통한 테스트는 더 강력해야 합니다.
경험으로 볼 때: 사항에 두 이 모두 가능합니다.두 작업 모델 모두 원하는 작업과 응용프로그램 요구사항에 따라 사용할 수 있습니다.뒤에 있는 아이디어VaD
내용 및 컨테이너를 해독하는 중입니다.을 구현하는 VaD
이 유형의 항목을 표시할 때마다 이 템플릿을 사용할 수 있습니다(기본값).에서 사용할 수 있습니다.ItemsControls
, grids 및 (lists, list views, grids) 및ContentControls
바인딩만 만듭니다.대로 네가말시피다했피▁like시.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
이 마지막 것은 윈도우가 필요 없는 앱의 내부 항목에 사용할 수 있습니다.애플리케이션 요구 사항과 앱 개발에 사용할 수 있는 시간에 따라 무엇이 더 나은지 선택합니다.이 개인적인 경험이 도움이 되길 바랍니다...
언급URL : https://stackoverflow.com/questions/19864891/wpf-mvvm-why-use-contentcontrol-datatemplate-views-rather-than-straight-xaml-w
'programing' 카테고리의 다른 글
"gip:"을 사용하여 node-gip 재구축 시 "npm install"이 실패함:감지된 Xcode 또는 CLT 버전이 없습니다!' (0) | 2023.05.28 |
---|---|
DateTime 유형의 생일을 기준으로 누군가의 나이를 계산하려면 어떻게 해야 합니까? (0) | 2023.05.28 |
일반적인 jquery 패키지와 슬림 패키지의 차이점은 무엇입니까? (0) | 2023.05.28 |
Xcode - 하지만...우리의 기록 보관소는 어디에 있습니까? (0) | 2023.05.28 |
.Net 4.5 : IDataErrorInfo 또는 INotifyDataErrorInfo를 사용해야 합니까? (0) | 2023.05.28 |