2013-02-22 26 views
21

Bileşik olarak gevşek bir şekilde birleştirilmiş MVVM WPF uygulaması yazıyor ve bir ana VM'deki çocuk VM'leri, sınıf örnekleri yerine arayüzlerdir;DataTemplate veri türü arabirime nasıl bağlanır?

public IChildViewModel { get; set; } 

Şimdi bu özelliği DataTemplate kullanarak nasıl oluşturabilirim? gibi:

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

Ben arayüzleri doğası (çoklu kalıtım vb) nedeniyle anlaşılması WPF bu doğrudan bağlanma izin vermez. Ancak, arabirimler gevşek birleştirilmiş uygulamalarda yaygın olarak kullanıldığından, DataTemplate'i arayüzlere bağlamak için herhangi bir geçici çözüm var mı? Teşekkürler.

+1

“ContentTemplate” öğesini DataContext ve Arabirimini bir "IValueConverter" öğesine geçiren bir "DataTrigger" tabanlı olarak ayarlayan bir ContentControl öğesini kullanmaya ne dersiniz? Daha sonra, Değer, Parametre ile iletilen türden olup olmadığını sınamayabilir ve True, uygun DataTemplate kullanırsa – Rachel

cevap

7

Sen bir arayüz alanına bağlayıcı olduğunu açıkça wpf anlatarak arayüzleri bağlanabilen:

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

(ViewModelBase INotifyPropertyChanged arabirimini uygulayan bir taban sınıfı basitçe olduğuna dikkat edin) Sonra ViewModel tarih:

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

Ve nihayet Xaml mümkün kılan:

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

Gördüğünüz gibi, ciltleme 'IInterface' tanımına açıkça atıfta bulunmaktadır.

+0

Bu gerçekten çalışıyor mu? Burada ele alındığı gibi XAML tip sisteminin arayüzleri dikkate almadığına inanıyorum: http://badecho.com/2012/07/adding-interface-support-to-datatemplates/ Bu, derleme olsa da. Sanırım beklendiği gibi çalışıyor. – Gui

+0

Gerçekten, denedim: Bu derler ama DataTemplate uygulanmaz. – ckuepker