나는 크고 긴 xaml이 있습니다. 그런 다음 xaml의 메뉴 부분에 대한 UserControl을 만들어 깔끔하게 만들었습니다. 기본 xaml 코드 숨김에서 ViewModel 클래스를 인스턴스화하고 기본 xaml의 DataContext로 설정했습니다. 기본 및 메뉴 xaml이 서로 통신 할 수 있도록 메뉴 코드 숨김의 데이터 컨텍스트와 동일한 뷰 모델을 사용하기로 선택했습니다. 다른 ViewModel 클래스를 인스턴스화했습니다. 내 코드는 지금까지 잘 작동합니다.
그러나 나는이 일을 제대로하고 있지 않다고 느낍니다. ViewModel 인스턴스의 인스턴스가 하나만 필요하다고 생각합니다. 하지만 main.xaml.cs와 menu.xaml.cs는 서로를 모르기 때문에 인스턴스를 공유하는 방법을 모릅니다.
App.xaml.cs에 속성을 추가 한 다음 컨트롤에서 바인딩 할 수 있습니다.
첫 번째 접근 방식 : XAML 리소스로
모델 :
public class MyViewModel
{
public int Hello { get; set; }
}
App.xaml.cs :
<Application x:Class="WpfApplication12.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication12="clr-namespace:WpfApplication12"
StartupUri="MainWindow.xaml">
<Application.Resources>
<wpfApplication12:MyViewModel x:Key="MyViewModel" />
</Application.Resources>
</Application>
작은 참고 : x:Shared="True"
기본값이므로 객체에 주석을 달 필요가 없으며 동일한 인스턴스가 반환됩니다. http://msdn.microsoft.com/en-us/library/aa970778.aspx
사용자 제어 :
<UserControl x:Class="WpfApplication12.UserControl2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid DataContext="{Binding Mode=OneWay, Source={StaticResource MyViewModel}}">
<TextBlock Text="{Binding Path=Hello}" />
</Grid>
</UserControl>
이제 모델이 리소스이므로 속성을 만들어 검색 할 수 있습니다.
public MyViewModel MyViewModel
{
get { return Application.Current.FindResource("MyViewModel") as MyViewModel; }
}
(하지만 해당 참조를 필드에 저장하는 것이 좋습니다.)
두 번째 접근 방식 : 기존 속성으로
어떤 이유로 기존 속성을 선호하는 경우 구문은 다음과 같습니다.
속성은 정적이며 정적 생성자에서 초기화됩니다.
public partial class App : Application
{
static App()
{
MyViewModel = new MyViewModel();
}
public static MyViewModel MyViewModel { get; set; }
}
사용자 정의 컨트롤에 바인딩 :
<Grid DataContext="{Binding Source={x:Static wpfApplication12:App.MyViewModel}}"/>
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다