DataContext 속성을 사용하여 XAML의 창에 ViewModel을 설정하려면 어떻게 해야 합니까?
그 질문이 거의 모든 것을 말해줍니다.
창이 있고 전체 네임스페이스를 사용하여 DataContext를 ViewModel로 설정하려고 했는데 뭔가 잘못된 것 같습니다.
<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="BuildAssistantUI.ViewModels.MainViewModel">
대신 이것을 사용해 보세요.
<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:VM="clr-namespace:BuildAssistantUI.ViewModels">
<Window.DataContext>
<VM:MainViewModel />
</Window.DataContext>
</Window>
다른 사용자가 제공한 솔루션 외에도 XAML에서 View Model을 지정하면서 특정 View Model을 View에서 분리하는 방법이 있습니다.분리된 테스트 사례를 작성하려는 경우 이러한 테스트 사례를 구분하는 것이 유용합니다.
App.xaml에서:
<Application
x:Class="BuildAssistantUI.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BuildAssistantUI.ViewModels"
StartupUri="MainWindow.xaml"
>
<Application.Resources>
<local:MainViewModel x:Key="MainViewModel" />
</Application.Resources>
</Application>
기본 창.xaml에서:
<Window x:Class="BuildAssistantUI.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DataContext="{StaticResource MainViewModel}"
/>
기본 뷰 모델을 인스턴스화하고 데이터 컨텍스트로 설정해야 합니다.문장에서 문자열 값으로 간주합니다.
<Window x:Class="BuildAssistantUI.BuildAssistantWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BuildAssistantUI.ViewModels">
<Window.DataContext>
<local:MainViewModel/>
</Window.DataContext>
뷰 모델을 지정하는 훨씬 더 나은 방법도 있습니다.
using Wpf = System.Windows;
public partial class App : Wpf.Application //your skeleton app already has this.
{
protected override void OnStartup( Wpf.StartupEventArgs e ) //add this.
{
base.OnStartup( e );
MainWindow = new MainView();
MainWindow.DataContext = new MainViewModel( e.Args );
MainWindow.Show();
}
}
위의 메커니즘은 기본 뷰 모델에만 적용됩니다.사용자 컨트롤에 대해 묻는 아래의 설명을 다루기 위해 메커니즘은 하위 뷰 모델에 대해 다음과 같이 변환됩니다.
public class ParentViewModel
{
public MyChildViewModel ChildViewModel { get; }
public ParentViewModel()
{
ChildViewModel = new MyChildViewModel( ... );
}
}
ParentView.xaml:
[...]
xmlns:local="clr-namespace:the-namespace-of-my-wpf-stuff"
[...]
<local:MyChildView DataContext="{Binding ChildViewModel}" />
[...]
<Rant>
이전에 제안된 모든 솔루션에는 뷰 모델에 매개 변수 없는 생성자가 있어야 합니다.Microsoft는 매개 변수 없는 생성자를 사용하여 시스템을 구축할 수 있다는 인상을 받고 있습니다.만약 당신도 그런 인상을 받고 있다면, 부디 다른 해결책들을 사용하세요.생성자가 매개 변수를 가지고 있어야 하므로 객체의 인스턴스화를 마법 프레임워크의 손에 맡길 수 없다는 것을 이해하는 사람들에게 뷰 모델을 지정하는 적절한 방법은 위에서 보여드린 것입니다.</Rant>
당신은 Catel을 시도해 보는 것이 좋을 것입니다.창 대신 데이터 창 클래스를 정의할 수 있으며, 해당 클래스는 자동으로 뷰 모델을 만듭니다.이렇게 하면 원래 게시물에서 했던 것처럼 View Model 선언을 사용할 수 있으며, View Model은 계속 생성되어 DataContext로 설정됩니다.
예를 들어 이 기사를 참조하십시오.
그것을 xaml에 설정하는 것은 나에게 효과가 없었습니다.코드를 반복해서 검토했더니 모든 것이 정상으로 보였습니다.문제를 해결한 것은 WindowIsLoaded 이벤트 핸들러에서 DataContext를 설정한 것입니다.
PrintDrsAnywayViewModel TheWindowsViewModel = new PrintDrsAnywayViewModel();
private void MyWindowIsLoaded(object sender, RoutedEventArgs e)
{
DataContext = TheWindowsViewModel;
TheWindowsViewModel.WindowHeaderMessage = "snot";
}
작동 전과 작동 후에 동일한 xaml은 다음과 같습니다.
<TextBlock Text="{Binding WindowHeaderMessage, Mode=OneWay}"
Margin="20,20,0,20" FontSize="20" />
WindowHeaderMessage는 INNotify를 구현하는 뷰 모델 파일의 문자열 속성입니다.속성 변경됨
hth
언급URL : https://stackoverflow.com/questions/4590446/how-do-i-set-a-viewmodel-on-a-window-in-xaml-using-datacontext-property
'source' 카테고리의 다른 글
Choosing MongoDb/CouchDb/RavenDb - performance and scalability advice (0) | 2023.05.26 |
---|---|
Linux 시스템에 연결된 모든 저장 장치 찾기 (0) | 2023.05.26 |
WPF 창이 열려 있는지 확인하는 방법 (0) | 2023.05.26 |
XML 구문 분석을 위한 최상의 노드 모듈 (0) | 2023.05.26 |
Windows Azure PaaS(웹 역할)의 진정한 대안은 무엇입니까? (0) | 2023.05.26 |