2009-07-19 1 views
0

TabControlの内部にUserControlをロードするXAMLコードがあります。私は、このXAMLコード置く場合XAMLがViewModelオブジェクトからUserControlをロードしない

<DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding Path=Gui}" 
    ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
    Margin="4" 
    /> 
</DataTemplate> 

を私は(GUIプロパティがViewModelにクラス内で、ユーザーコントロールを返す)のウィンドウに表示されabsolutly何も持っています。

しかし、私が代わりに前の1の彼のXAMLコードを置く場合:

<DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl 
    IsSynchronizedWithCurrentItem="True" 
    ItemsSource="{Binding}" 
    ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
    Margin="4" 
    /> 
</DataTemplate> 

を私はViewModelにオブジェクトロードを持っている:ここでは

alt text http://clip2net.com/clip/m12122/1248018108-clip-3kb.png

はそのTextBoxInputViewModelのコードの一部でありますVisual(usercontrol)を取得できるようにバインドする必要があるGuiプロパティを持っています。

private UserControl gui; 

    public UserControl Gui 
    { 
     get 
     { 
      if (this.gui == null) 
      { 
       this.gui = new SimpleTextBoxInputControl();//Xaml User Control 
       this.gui.DataContext = this;//Bind the Visual and ViewModel 
      } 
      return this.gui; 
     } 
    } 

このオブジェクト参照テキストの代わりにUserControlを入手するにはどうすればよいですか?

+0

ItemsSource = "{Binding Path = Gui}"の場合、出力ウィンドウを表示しようとしていますか?出力ウィンドウにバインドエラーが表示されたら、メッセージが表示されます –

+0

出力ウィンドウについてご連絡ありがとうございます。 "System.Windows.Data Error:32:ObjectDataProviderにObjectTypeまたはObjectInstanceのいずれかが必要です。"しかし、このバインディングに関連するかどうかは分かりません。 –

+0

バインディングを自分自身に置くと、そのバインディングの原因と関連しているとは思えません。 –

答えて

2

問題は、ItemSourceがコレクションで、1つの値であるプロパティにバインドしているためです。表示されている出力ウィンドウのエラーは、これに関連している可能性があります。

ビューモデルから直接UserControlを返す代わりに、タブのコンテンツを表す別のビューモデルを返し、テンプレートを使用してそのコンテンツを表示する方がよいでしょう。ビューモデルのTypeに基づいてテンプレートを選択するよりも動的にする必要がある場合は、TabControl.ContentTemplateSelectorに設定してください。これは、DataTemplateSelectorから派生するクラスに設定する必要があります。このクラスを使用して、そのタブにバインドされたオブジェクトに基づいて読み込むテンプレートを決定できます。

+0

申し訳ありませんが、今夜仕事から帰ってきたら、私はあなたの立場から調査します。私はそれが動作するかどうかを知らせます。 –

+0

ありがとう、これはあなたが知っているときにとても分かります。実際に、あなたはコレクションで私を明るくします。私は間違っていましたが、DataTemplateSelectorを使用する代わりに、単にTabControlの中でContentTemplateを使用し、テンプレートでPath = Guiにバインドして作業しました!ありがとう! –

1

あなたはsimpleModelがTextBoxInputViewModelの名前空間で、TextBoxInputControlを表示したいユーザーコントロールで、MYVIEWが名前空間である。この

<DataTemplate DataType="{x:Type simpleModel:TextBoxInputViewModel}"> 
     <myView:TextBoxInputControl /> 
    </DataTemplate> 

ようなあなたのapp.xamlファイルであなたのviewmodelのテンプレートを作成する必要がありますそのユーザーコントロールの

+0

申し訳ありませんが、TextBoxInputViewModelが他のコントロールである可能性があります。これは動的なので、Xamlに直接書き込むことができません。 –

関連する問題