2013-02-22 58 views
21

我正在編寫一個複合鬆散耦合的MVVM WPF應用程序,並且父虛擬機中的子虛擬機是接口而不是類實例,例如,如何將DataTemplate數據類型綁定到接口?

public IChildViewModel { get; set; } 

現在如何使用DataTemplate呈現此屬性?像:

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

據我所知,由於接口的性質(多繼承等)WPF不允許這種直接綁定。但是,由於接口應該在鬆散耦合的應用程序中廣泛使用,是否有任何解決方法將DataTemplate綁定到接口?謝謝。

+1

如何使用一個'ContentControl'來設置它是'ContentTemplate'基於一個'DataTrigger',它將DataContext和Interface傳遞給一個'IValueConverter'?然後,您可以測試Value是否是使用Parameter傳入的類型,如果True使用適當的DataTemplate – Rachel 2013-02-22 13:13:01

回答

7

,你可以告訴WPF明確表示要綁定到一個接口字段綁定到接口:

(請注意,ViewModelBase是一個實現了INotifyPropertyChanged接口一個基類)

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; } 
} 

然後在視圖模型:

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

最後XAML中,它使:

<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> 

正如您所看到的,綁定明確指向'IInterface'定義。

+0

這實際上是否工作?我相信XAML類型系統不考慮接口,如下所述:http://badecho.com/2012/07/adding-interface-support-to-datatemplates/雖然這可能會編譯。我懷疑它按預期工作。 – Gui 2017-12-18 03:58:49

+0

確實,我只是試過:它編譯但DataTemplate不適用。 – ckuepker 2018-02-06 18:21:24