2013-02-22 14 views
21

疎結合の複合MVVM WPFアプリケーションを作成しています。親VM内の子VMはクラスインスタンスではなくインターフェイスです。DataTemplateデータ型をインターフェイスにバインドする方法は?

public IChildViewModel { get; set; } 

DataTemplateを使用してこのプロパティをレンダリングするにはどうすればよいですか? like:

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

私は、インターフェイスの性質(多重継承など)のために理解しています。この直接バインディングはWPFでは許可されていません。しかし、インターフェイスは疎結合のアプリケーションで広く使用する必要があるため、DataTemplateをインターフェイスにバインドする回避策はありますか?ありがとう。

+1

DataContextとInterfaceを 'IValueConverter'に渡す' DataTrigger'に基づいて 'ContentTemplate'を設定する' ContentControl'を使うのはどうですか?値がパラメータで渡された型であるかどうかをテストし、Trueが適切なDataTemplateを使用する場合は – Rachel

答えて

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

その後のViewModel上:

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

+0

実際、私はちょうど試みました:それはコンパイルされますが、DataTemplateは適用されません。 – ckuepker

関連する問題