2013-02-22 45 views
21

Tôi đang viết một ứng dụng WPF MVVM kết hợp lỏng lẻo và các máy ảo con trong một máy chủ mẹ là các giao diện chứ không phải là các cá thể lớp, ví dụ:Làm cách nào để liên kết kiểu dữ liệu DataTemplate với giao diện?

public IChildViewModel { get; set; } 

Bây giờ, làm cách nào để hiển thị thuộc tính này bằng DataTemplate? như:

<DataTemplate DataType="{x:Type contracts:IChildViewModel}"> 

Tôi hiểu do bản chất của giao diện (đa thừa kế, vv) WPF không cho phép ràng buộc trực tiếp này. Nhưng như giao diện nên được sử dụng rộng rãi trong các ứng dụng lỏng lẻo kết hợp, có cách nào khác để liên kết DataTemplate với các giao diện không? Cảm ơn.

+1

Điều gì về việc sử dụng 'ContentControl' đặt' Nội dungTemplate' dựa trên 'DataTrigger' chuyển DataContext và Giao diện sang' IValueConverter'? Sau đó bạn có thể kiểm tra nếu Giá trị là loại được truyền vào bằng Tham số và nếu True sử dụng DataTemplate thích hợp – Rachel

Trả lời

7

Bạn có thể liên kết với giao diện bằng cách nói với WPF một cách rõ ràng rằng bạn đang liên kết với một trường giao diện:

(Xin lưu ý rằng ViewModelBase chỉ đơn giản là một cơ sở đẳng cấp mà thực hiện INotifyPropertyChanged interface)

public class Implementation : ViewModelBase, IInterface 
{ 
    private string textField; 

    public string TextField 
    { 
     get 
     { 
      return textField; 
     } 
     set 
     { 
      if (value == textField) return; 
      textField = value; 
      OnPropertyChanged(); 
     } 
    } 
} 

public interface IInterface 
{ 
    string TextField { get; set; } 
} 

sau đó, trên ViewModel:

private IInterface interfaceContent; 
public IInterface InterfaceContent 
{ 
    get { return interfaceContent; } 
} 

Và cuối cùng là XAML mà làm cho nó có thể:

<ContentControl Grid.Row="1" Grid.Column="0" Content="{Binding InterfaceContent}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate DataType="{x:Type viewModels:IInterface}"> 
      <TextBox Text="{Binding Path=(viewModels:IInterface.TextField)}"/> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 

Như bạn có thể thấy, ràng buộc đề cập rõ ràng đến xác định 'IInterface'.

+0

Điều này có thực sự hoạt động không? Tôi tin rằng hệ thống kiểu XAML không xem xét các giao diện, như được thảo luận ở đây: http://badecho.com/2012/07/adding-interface-support-to-datatemplates/ Mặc dù điều này có thể biên dịch. Tôi nghi ngờ nó hoạt động như mong đợi. – Gui

+0

Thật vậy, tôi vừa thử: Nó biên dịch nhưng DataTemplate không được áp dụng. – ckuepker