XAML не загружает UserControl из объекта ViewModel - PullRequest
0 голосов
/ 19 июля 2009

У меня есть код XAML, который должен загрузить мои UserControl в TabControl.

Если я введу этот код XAML:

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

У меня абсолютно ничего не появляется в окнах (свойство Gui находится внутри класса ViewModel и возвращает UserControl).

Но если я поставлю его код XAML вместо предыдущего:

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

У меня загрузка объекта ViewModel:

alt text
(источник: clip2net.com )

Вот фрагмент кода TextBoxInputViewModel со свойством Gui, который должен быть связан, чтобы иметь возможность получить 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;
        }
    }

Есть идеи, как я могу получить UserControl вместо этого текста ссылки на объект?

Ответы [ 2 ]

2 голосов
/ 20 июля 2009

Проблема в том, что ItemSource - это коллекция, в которой вы привязываете ее к свойству, которое является только одним значением. Вероятно, ошибка в окне «Вывод» связана с этим.

Вместо того, чтобы возвращать UserControl непосредственно из вашей модели представления, было бы лучше вернуть другую модель представления, которая представляет содержимое вкладки, и использовать шаблоны для отображения этого содержимого. Если вам нужно, чтобы он был более динамичным, чем выбор шаблона на основе Type модели представления, посмотрите на настройку TabControl.ContentTemplateSelector . Это должно быть установлено для класса, который наследуется от DataTemplateSelector . Вы можете использовать этот класс, чтобы решить, какой шаблон загрузить на основе объекта, привязанного к этой вкладке.

1 голос
/ 19 июля 2009

вы должны создать шаблон для вашей модели представления в вашем файле app.xaml, как это

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

где simpleModel - это пространство имен TextBoxInputViewModel, а TextBoxInputControl - это пользовательский элемент управления, который вы хотите показать, а myView - это пространство имен этого пользовательского элемента управления.

...