XAML不从ViewModel对象加载UserControl

时间:2009-07-19 15:42:36

标签: wpf xaml .net-3.5

我有一个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 个答案:

答案 0 :(得分:2)

问题是ItemSource是一个集合,当你将它绑定到只有一个值的属性时。您看到的“输出”窗口中的错误可能与此有关。

不是直接从View模型中返回UserControl,而是返回另一个表示选项卡内容的View Model,并使用模板显示该内容。如果您需要它比基于视图模型的Type选择模板更具动态性,请查看设置TabControl.ContentTemplateSelector。这需要设置为派生自DataTemplateSelector的类。您可以使用此类根据绑定到该选项卡的对象来决定加载哪个模板。

答案 1 :(得分:1)

您应该在app.xaml文件中为您的viewmodel创建一个模板,如下所示

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

其中simpleModel是TextBoxInputViewModel的命名空间,TextBoxInputControl是您要显示的用户控件,myView是该用户控件的命名空间。