2009-03-11 4 views

답변

3

아니요, 현재 사양에는 Xaml에 강력한 입력이 없습니다. 나는 .Net 4.0을 통해 Xaml이 generics를위한 용량을보아야한다고 생각한다. 따라서 Xaml에서 강력한 입력을하는 것이 훨씬 쉬워야한다고 생각합니다.

3

:

<TextBox Text="{Binding Path=(vm:Site.Contact).(vm:Contact.Name)}" /> 

그러나이 텍스트 상자의 DataContext 유형의 ViewModel.Site이라는 사실을 확인하지 것이다 (나는 이것이 가능하지 생각하지만, 나는 틀릴 수도있다.)

0

이 시도 :

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    <ContentPresenter Content="{Binding}" Template="{StaticResource TypedTemplate}" /> 
</Window> 

이 코드를 테스트하지 않은하지만 당신에게 아이디어를 줄 것이다. 내용 발표자는 DataTemplate을 사용할 현재 DataContext를 표시합니다. 이것은 컴파일러에 강하게 입력되지 않지만로드시 즉시 (런타임 환경의 InitializeComponent에서) 런타임 오류를 발생시킵니다. 무언가가 깨지면 테스트에서 쉽게 잡을 수 있어야합니다.

+0

.Net 3.5에는 DataTemplate이 없습니다.TargetType 속성 –

+0

@Brian 당신 말이 맞아요, 그것은 DataType입니다. 나는 그것이 테스트되지 않았다고 말했다. 나는 그 오류를 수정하기위한 답을 업데이트했다. –

2

번호 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> 
1

나는 개인적으로 내 뷰 모델에서 각 속성의 기준이 사용하는 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}}

이 방법은 모든 내 바인딩은 빌드시 유효성이 검사됩니다.

관련 문제