2013-02-22 4 views
21

Sto scrivendo un'applicazione WVF MVVM composita ad accoppiamento libero e le VM figlio in una macchina virtuale padre sono interfacce piuttosto che istanze di classe, ad es.Come associare DataTemplate DataTemplate all'interfaccia?

public IChildViewModel { get; set; } 

Ora come si esegue il rendering di questa proprietà utilizzando un DataTemplate? come:

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

ho capito a causa della natura delle interfacce (ereditarietà multipla, ecc) WPF non consente questo legame diretto. Ma dal momento che le interfacce dovrebbero essere ampiamente utilizzate in applicazioni con accoppiamento lento, c'è qualche soluzione per legare DataTemplate alle interfacce? Grazie.

+1

Che dire dell'utilizzo di un 'ContentControl' che imposta il suo' ContentTemplate' basato su un 'DataTrigger' che passa DataContext e Interface a un' IValueConverter'? È quindi possibile verificare se il valore è del tipo passato con il parametro e se True utilizza il DataTemplate appropriato – Rachel

risposta

7

È possibile associare alle interfacce dicendo WPF esplicitamente che si sono vincolanti per un campo di interfaccia:

(Si prega di notare che ViewModelBase è semplicemente una classe base che implementa l'interfaccia 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; } 
} 

poi sul ViewModel:

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

E infine la Xaml che rende possibile:

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

Come si può vedere, il legame si riferisce esplicitamente alla definizione di "IInterface".

+0

Funziona effettivamente? Credo che il sistema di tipo XAML non consideri le interfacce, come discusso qui: http://badecho.com/2012/07/adding-interface-support-to-datatemplates/ Anche se questo potrebbe essere compilato. Dubito che funzioni come previsto. – Gui

+0

Infatti, ho appena provato: si compila ma DataTemplate non viene applicato. – ckuepker