2009-07-19 8 views
0

Ich habe einen XAML-Code, der meine UserControl innerhalb der TabControl laden soll.XAML lädt UserControl nicht vom ViewModel-Objekt

Wenn ich diesen XAML-Code setzen:

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

Ich habe absolut nichts erscheinen in den Fenstern (Gui Eigenschaft innerhalb der Viewmodel-Klasse ist und ein Usercontrol zurück).

Aber wenn ich seine XAML-Code anstelle des vorherigen setzen:

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

Ich habe das Ansichtsmodell Objekt Laden:

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

Hier ist ein Stück Code, der TextBoxInputViewModel dass hat die Eigenschaft Gui, die gebunden werden sollte, um das Visual zu bekommen (usercontrol):

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

Irgendeine Idee, wie ich das UserControl anstelle dieses Objektreferenztextes bekommen kann?

+0

Versuchen Sie im Ausgabefenster im Falle von ItemsSource = "{Binding Path = Gui}" zu suchen? Ausgabefenster zeigt verbindliche Fehler, sollte die Nachricht helfen –

+0

Vielen Dank, um mich über die Ausgabe Windows zu bemerken. Ich sehe "System.Windows.Data Error: 32: ObjectDataProvider benötigt entweder einen ObjectType oder ObjectInstance." Aber kann nicht sehen, ob es zu dieser Bindung gehört oder nicht. –

+0

Ich glaube nicht, dass es mit dieser verbindlichen Ursache zusammenhängt, wenn ich die Bindung an sich selbst anlege, hat es immer noch diesen Fehler. –

Antwort

2

Das Problem ist, dass ItemSource eine Sammlung ist, wo Sie es an eine Eigenschaft binden, die nur ein Wert ist. Der Fehler im Ausgabefenster, den Sie sehen, hängt wahrscheinlich damit zusammen.

Anstatt eine UserControl direkt aus Ihrem Ansichtsmodell zurückzugeben, wäre es besser, ein anderes Ansichtsmodell zurückzugeben, das den Inhalt der Registerkarte darstellt, und mithilfe von Vorlagen diesen Inhalt anzuzeigen. Wenn Sie es dynamischer als das Wählen der Vorlage basierend auf der Type des View-Modells benötigen, schauen Sie in die Einstellung . Dies muss auf eine Klasse festgelegt werden, die von DataTemplateSelector abgeleitet ist. Sie können diese Klasse verwenden, um zu entscheiden, welche Vorlage basierend auf dem Objekt geladen werden soll, das an diese Registerkarte gebunden ist.

+0

Okay, heute Nacht, wenn ich von der Arbeit zurück bin, werde ich von deinem Standpunkt aus forschen. Ich werde Sie wissen lassen, ob es funktioniert oder nicht. –

+0

Vielen Dank, das ist so offensichtlich, wenn Sie es wissen. In der Tat, Sie beleuchten mich mit der Sammlung. Ich war so falsch, aber anstatt DataTemplateSelector zu verwenden, habe ich einfach ContentTemplate im TabControl und in der Vorlage, die ich an den Path = Gui gebunden habe, verwendet und es hat funktioniert! Vielen Dank! –

1

Sie so eine Vorlage für Ihre Viewmodel in Ihrer app.xaml-Datei erstellen soll

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

wo simpleModel der Namensraum von TextBoxInputViewModel ist, und TextBoxInputControl ist der Benutzer die Kontrolle Sie anzeigen möchten und myView ist der Namespace dieses Benutzersteuerelements.

+0

In Ordnung, aber das TextBoxInputViewModel könnte ein anderes Steuerelement sein, es ist dynamisch, deshalb kann ich es nicht direkt in das Xaml schreiben. –

Verwandte Themen