2009-03-11 34 views

Trả lời

3

Không, thông số kỹ thuật hiện tại không có tính năng nhập mạnh mẽ trong Xaml. Tôi tin rằng với .Net 4.0, Xaml nên được nhìn thấy năng lực cho Generics. Với điều đó, tôi nghĩ sẽ dễ dàng hơn khi gõ mạnh vào Xaml.

3

Bạn có thể viết mỗi cá nhân gắn kết một cách mạnh mẽ-gõ:

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

Tuy nhiên điều này sẽ không xác nhận thực tế là TextBox DataContext là loại ViewModel.Site (và tôi nghĩ rằng đây là không thể, nhưng Tôi có thể sai).

0

Hãy thử điều này:

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

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

tôi đã không kiểm tra mã này nhưng nó sẽ cho bạn ý tưởng. Trình bày nội dung sẽ hiển thị DataContext hiện tại sẽ sử dụng DataTemplate. Điều này không được gõ mạnh trong trình biên dịch nhưng sẽ ném một lỗi thời gian chạy ngay lập tức khi tải (trong InitializeComponent của cửa sổ). Bạn sẽ có thể nắm bắt điều này một cách dễ dàng trong thử nghiệm của bạn nếu một cái gì đó phá vỡ.

+0

.Net 3.5 không có DataTemplate.Thuộc tính TargetType –

+0

@Brian Bạn nói đúng, đó là DataType. Tôi nói nó chưa được kiểm chứng. Tôi đã cập nhật câu trả lời để sửa lỗi. –

2

No. FrameworkElement.DatatContext là thuộc tính phụ thuộc cho phép ràng buộc dữ liệu thuộc loại object.

Như được chỉ ra bởi những người khác, bạn có thể chỉ định loại mong đợi là DataContext cho mẫu đặc biệt được gọi là DataTemplate. Nhiều điều khiển như ItemsControl, ControlControl cung cấp quyền truy cập vào DataTemplates để cho phép bạn đặt kỳ vọng của biểu diễn trực quan về loại DataContext.

Bryan đúng, anh ấy không kiểm tra mã của mình.

Việc áp dụng đúng đắn về một DataTemplate gõ trông như thế này:

<Window> 
    <Window.Resources> 
     <DataTemplate x:Key="TypedTemplate" DataType="{x:Type myViewModel}"> 
     ... 
     </DataTemplate> 
    </Window.Resources> 
    <ContentControl Content="{Binding}" ContentTemplate="{StaticResource TypedTemplate}" /> 
</Window> 

ContentPresenter thừa hưởng trực tiếp từ FrameworkElement và không có một tài sản Mẫu. Ngoài ra, các tài sản mẫu thường đề cập đến Control.Template loại ControlTemplate đó là một cái gì đó hoàn toàn khác với một DataTemplate.

Tôi nghĩ Bryan đang nghĩ đến số ContentControl là một trong hai loại kiểm soát gốc (loại kia là ItemsControl). ContentControl thực tế được kế thừa từ Kiểm soát. Do đó chúng tôi có thể chỉ định thuộc tính Mẫu trên đó nếu chúng tôi chọn.

<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

Cá nhân tôi tuyên bố một PropertyPath tĩnh cho mỗi tài sản trong viewmodel tôi tham chiếu này sử dụng x: tĩnh như con đường bắt buộc - ví dụ

public class MyViewModel 
{ 
    public static PropertyPath MyPropertyPath = new PropertyPath("MyProperty"); 
    public bool MyProperty{get; set;} 
} 

XAML: {Binding Path={x:Static local:MyViewModel.MyPropertyPath}}

Bằng cách này tất cả các ràng buộc của tôi được xác thực trên bản dựng.

Các vấn đề liên quan