WPF绑定到view和viewmodel´;s属性

WPF绑定到view和viewmodel´;s属性,wpf,xaml,telerik,Wpf,Xaml,Telerik,这本来是一个关于Teleriks TabbedWindow控件的问题,但实际上是一个通用问题。 问题在ItemTemplate中,如何绑定到viewmodel的视图和属性 下面,我的数据源是一个视图列表(即UserControls)。我希望在ContentControl中显示视图,在标头中显示viewmodel的一些属性 选项卡2属性应返回一个IEnumerable,其中类型T具有一些绑定到XAML标记中的公共属性 例如,它可能有一个TabHeader属性,您可以将选项卡的标题绑定到ItemT

这本来是一个关于Teleriks TabbedWindow控件的问题,但实际上是一个通用问题。 问题在ItemTemplate中,如何绑定到viewmodel的视图和属性

下面,我的数据源是一个视图列表(即UserControls)。我希望在ContentControl中显示视图,在标头中显示viewmodel的一些属性


选项卡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>