2013-02-22 18 views
21

Piszę luźno powiązaną aplikację WPF MVVM, a potomne maszyny wirtualne w nadrzędnej maszynie wirtualnej są interfejsami, a nie instancjami klasy, np.Jak powiązać typ danych DataTemplate z interfejsem?

public IChildViewModel { get; set; } 

Teraz, jak mogę renderować tę właściwość za pomocą DataTemplate? jak:

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

Rozumiem, ze względu na charakter interfejsów (wielokrotne dziedziczenie itp) WPF nie pozwalają na to bezpośrednie wiązanie. Ale jako że interfejsy powinny być szeroko stosowane w luźno powiązanych aplikacjach, czy istnieje sposób obejścia problemu DataTemplate z interfejsami? Dzięki.

+1

Co powiesz na użycie 'ContentControl', który ustawia' ContentTemplate' w oparciu o 'DataTrigger', który przekazuje DataContext i Interface do' IValueConverter'? Następnie można przetestować, czy wartość jest typu przekazanego z parametrem, i czy True używa odpowiedniego DataTemplate – Rachel

Odpowiedz

7

można powiązać z interfejsami mówiąc WPF wyraźnie, że są wiążące do pola interfejsu:

(Należy pamiętać, że ViewModelBase to po prostu baza-klasa, która implementuje interfejs 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; } 
} 

następnie na ViewModel:

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

i wreszcie XAML, który umożliwia:

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

Jak widać, powiązanie odnosi się jednoznacznie do definicji "IInterface".

+0

Czy to rzeczywiście działa? Uważam, że system typu XAML nie uwzględnia interfejsów, jak to omówiono tutaj: http://badecho.com/2012/07/adding-interface-support-to-datatemplates/ Chociaż może się to skompilować. Wątpię, żeby działało zgodnie z oczekiwaniami. – Gui

+0

Rzeczywiście, po prostu próbowałem: Kompiluje, ale DataTemplate nie jest stosowana. – ckuepker

Powiązane problemy