MVVM- 패턴을 사용하여 DataContext를 특정 ViewModel로 설정합니다. 이제 XAML에 DataContext의 형식을 알려서 바인딩을 확인하도록 할 방법이 있습니까?WPF/XAML에서 강력한 형식의 바인딩을 얻을 수 있습니까?
ASP.NET MVC의 입력 된 viewdata와 비슷한 것을 찾고 있습니다.
각 개인이 강력한 형식의 방법으로 바인딩을 쓸 수MVVM- 패턴을 사용하여 DataContext를 특정 ViewModel로 설정합니다. 이제 XAML에 DataContext의 형식을 알려서 바인딩을 확인하도록 할 방법이 있습니까?WPF/XAML에서 강력한 형식의 바인딩을 얻을 수 있습니까?
ASP.NET MVC의 입력 된 viewdata와 비슷한 것을 찾고 있습니다.
각 개인이 강력한 형식의 방법으로 바인딩을 쓸 수아니요, 현재 사양에는 Xaml에 강력한 입력이 없습니다. 나는 .Net 4.0을 통해 Xaml이 generics를위한 용량을보아야한다고 생각한다. 따라서 Xaml에서 강력한 입력을하는 것이 훨씬 쉬워야한다고 생각합니다.
:
<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" />
그러나이 텍스트 상자의 DataContext 유형의 ViewModel.Site이라는 사실을 확인하지 것이다 (나는 이것이 가능하지 생각하지만, 나는 틀릴 수도있다.)
이 시도 :
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" />
</Window>
이 코드를 테스트하지 않은하지만 당신에게 아이디어를 줄 것이다. 내용 발표자는 DataTemplate을 사용할 현재 DataContext를 표시합니다. 이것은 컴파일러에 강하게 입력되지 않지만로드시 즉시 (런타임 환경의 InitializeComponent에서) 런타임 오류를 발생시킵니다. 무언가가 깨지면 테스트에서 쉽게 잡을 수 있어야합니다.
번호 FrameworkElement.DatatContext
은 데이터 바인딩이 object
인 종속성 속성입니다.
다른 사람들이 지적한대로 DataTemplate
이라는 특수 템플릿에 대해 예상되는 유형을 DataContext
으로 지정할 수 있습니다. ItemsControl
, ControlControl
과 같은 많은 컨트롤은 DataText에 대한 액세스를 제공하여 DataContext의 형식에 대한 시각적 표현의 기대치를 설정할 수 있도록합니다.
브라이언은 정확합니다. 그는 코드를 테스트하지 않았습니다.
입력 된 DataTemplate을의 올바른 응용 프로그램은 다음과 같습니다
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
</Window.Resources>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" />
</Window>
ContentPresenter에이 FrameworkElement에서 직접 상속과 템플릿 속성이 없습니다. 또한 Template 속성은 일반적으로 DataTemplate과 완전히 다른 ControlTemplate 형식의 Control.Template을 참조합니다.
브라이언은 두 루트 제어 유형 중 하나 인 ContentControl
(다른 하나는 ItemsControl
임)을 생각했다고 생각합니다. ContentControl
실제로 컨트롤에서 상속합니다. 따라서 우리가 그렇게 선택하면 Template 속성을 지정할 수 있습니다.
<Window>
<Window.Resources>
<DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}">
...
</DataTemplate>
<ControlTemplate x:Key="ControlSkin" TargetType="{x:Type ContentControl}">
...
</ControlTemplate>
</Window.Resources>
<ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" Template="{StaticResource ControlSkin}" />
</Window>
나는 개인적으로 내 뷰 모델에서 각 속성의 기준이 사용하는 X를 정적 PropertyPath를 선언 : 바인딩 경로 정적 - 예를 들어
public class MyViewModel
{
public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty");
public bool MyProperty{get; set;}
}
XAML : {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}
이 방법은 모든 내 바인딩은 빌드시 유효성이 검사됩니다.
.Net 3.5에는 DataTemplate이 없습니다.TargetType 속성 –
@Brian 당신 말이 맞아요, 그것은 DataType입니다. 나는 그것이 테스트되지 않았다고 말했다. 나는 그 오류를 수정하기위한 답을 업데이트했다. –