Patrick Desjardins
Patrick Desjardins

Reputation: 140833

XAML does not load UserControl from ViewModel object

I have a XAML code that should load my UserControl inside the TabControl.

If I put this XAML code:

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

I have absolutly nothing appear in the windows (Gui property is inside the ViewModel class and return a UserControl).

But if I put his XAML code instead of the previous one:

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

I have the ViewModel Object loading:

alt text
(source: clip2net.com)

Here is a piece of code of the TextBoxInputViewModel that has the property Gui that should be binded to be able to get the Visual (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;
        }
    }

Any idea how that I can get the UserControl instead of this object reference text?

Upvotes: 0

Views: 1257

Answers (2)

Andy
Andy

Reputation: 30418

The problem is that ItemSource is a collection, where as you're binding it to a property that is just one value. The error in the Output window that you're seeing is likely related to this.

Instead of returning a UserControl directly from your View Model, it would be better to return another View Model that represents the contents of the tab, and use templates to display that content. If you need it to be more dynamic than choosing the template based on the Type of the View Model, look into setting TabControl.ContentTemplateSelector. This needs to be set to a class that derives from DataTemplateSelector. You can use this class to decide which template to load based on the object bound to that tab.

Upvotes: 2

Arsen Mkrtchyan
Arsen Mkrtchyan

Reputation: 50722

you should create a template for your viewmodel in your app.xaml file like this

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

where simpleModel is the namespace of TextBoxInputViewModel, and TextBoxInputControl is the user control you want to show and myView is the namespace of that user control.

Upvotes: 1

Related Questions