WPF绑定到view和viewmodel´;s属性
这本来是一个关于Teleriks TabbedWindow控件的问题,但实际上是一个通用问题。 问题在ItemTemplate中,如何绑定到viewmodel的视图和属性 下面,我的数据源是一个视图列表(即UserControls)。我希望在ContentControl中显示视图,在标头中显示viewmodel的一些属性WPF绑定到view和viewmodel´;s属性,wpf,xaml,telerik,Wpf,Xaml,Telerik,这本来是一个关于Teleriks TabbedWindow控件的问题,但实际上是一个通用问题。 问题在ItemTemplate中,如何绑定到viewmodel的视图和属性 下面,我的数据源是一个视图列表(即UserControls)。我希望在ContentControl中显示视图,在标头中显示viewmodel的一些属性 选项卡2属性应返回一个IEnumerable,其中类型T具有一些绑定到XAML标记中的公共属性 例如,它可能有一个TabHeader属性,您可以将选项卡的标题绑定到ItemT
选项卡2属性应返回一个
IEnumerable
,其中类型T
具有一些绑定到XAML标记中的公共属性
例如,它可能有一个TabHeader
属性,您可以将选项卡的标题绑定到ItemTemplate
中,如下所示:
<telerik:RadTabbedWindow x:Class="Porter.Application.Views.MainWindow"
...
ItemsSource="{Binding Tabs2}">
<telerik:RadTabbedWindow.ItemTemplate>
<DataTemplate>
<TextBlock Text = "{Binding TabHeader}" />
</ DataTemplate >
</ telerik:RadTabbedWindow.ItemTemplate>
</telerik:RadTabbedWindow>
不应在视图模型中创建UserControl
,并将其添加到Tabs2
。这打破了MVVM模式的全部内容,即关注点分离。视图模型不会创建视图
如果在App.xaml
中没有/不需要隐式DataTemplate
,当然也可以定义ContentTemplate
内联:
<telerik:RadTabbedWindow x:Class="Porter.Application.Views.MainWindow"
...
ItemsSource="{Binding Tabs2}">
<telerik:RadTabbedWindow.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabHeader}" />
</DataTemplate>
</telerik:RadTabbedWindow.ItemTemplate>
<telerik:RadTabbedWindow.ContentTemplate>
<DataTemplate>
<local:UserControl1 />
</DataTemplate>
</telerik:RadTabbedWindow.ContentTemplate>
</telerik:RadTabbedWindow>
关键的一点是,您在两个模板中都绑定了
T
的属性,并且T
是一个POCO,而不是某种类型的控件。什么类型是Tabs2
?UswrControl。我不知道从VM tp V到userControl的任何方法,所以我找到了userControl,希望能通过。DataContextFrom DataTemplate如果你想绑定到VM的属性,你必须使用RelativeSource。好的,看起来很合理。我希望不必指定每个VM视图,因为我希望在TabbedWondow控件中有许多不同的控件。我现在下班了,但我会给你打电话,并将你的答案标记为正确,因为我已经验证了使用内联ContentTemplate
而不使用TargetType
适用于所有视图模型类型。谢谢!我终于让它工作了:)。我在控件的参考资料(RadTabbedWindow)下移动了模板。(小东西:DataTempate的属性是“DataType”,而不是“TargetType”)@Cowborg:当然。编辑。
<telerik:RadTabbedWindow x:Class="Porter.Application.Views.MainWindow"
...
ItemsSource="{Binding Tabs2}">
<telerik:RadTabbedWindow.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabHeader}" />
</DataTemplate>
</telerik:RadTabbedWindow.ItemTemplate>
<telerik:RadTabbedWindow.ContentTemplate>
<DataTemplate>
<local:UserControl1 />
</DataTemplate>
</telerik:RadTabbedWindow.ContentTemplate>
</telerik:RadTabbedWindow>