我有一个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对象加载:
(来源: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
而不是此对象引用文本?
答案 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是该用户控件的命名空间。