我有以下ViewModel:
public class DocumentViewModel : ViewModelBase
{
public virtual string TabHeader
{
get { return "Document"; }
}
private ObservableCollection<DATA> data;
/// <summary>
/// Source for Grid
/// </summary>
public ObservableCollection<DATA> Data
{
get { return data; }
set
{
data = value;
RaisePropertyChanged("Data");
}
}
// ...... a lot of properties and methods ....
}
我希望ProcurementViewModel
继承DocumentViewModel
:
public class ProcurementViewModel : DocumentViewModel
{
public override string TabHeader
{
get { return "Procurement"; }
}
}
请注意,我只覆盖一个属性。其余属性应从基本ViewModel中获取。
现在我想通过使用此DataTemplate显示它:
<DataTemplate DataType="{x:Type vm:ProcurementViewModel}">
<views:DocumentView />
</DataTemplate>
但没有显示数据。 TabHeader绑定到TabControl的Header - 它显示基于ViewModel的值。
如果我将DataType指定为{x:Type vm:DocumentViewModel}
,一切正常。
这是DocumentView的一部分,我使用DataTemplates:
<Grid>
<telerik:RadTabControl Name="rtcTabs" ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}" SelectedIndex="1">
<telerik:RadTabControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding TabHeader}"/>
</DataTemplate>
</telerik:RadTabControl.ItemTemplate>
<telerik:RadTabControl.Resources>
<DataTemplate DataType="{x:Type vm:DashboardViewModel}">
<views:DashboardView />
</DataTemplate>
<DataTemplate DataType="{x:Type vm:ProcurementViewModel}">
<views:DocumentView />
</DataTemplate>
</telerik:RadTabControl.Resources>
</telerik:RadTabControl>
</Grid>
以下是DocumentView.xaml的一部分:
<UserControl x:Class="DMRS.Views.DocumentView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:vm="clr-namespace:DMRS.ViewModels;assembly=DMRS.ViewModels"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="358" d:DesignWidth="582" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation">
<!--<UserControl.DataContext>
<vm:DocumentViewModel/>
</UserControl.DataContext>-->
<UserControl.Resources>
<Style x:Key="stlDocViewCombobox" TargetType="{x:Type telerik:RadComboBox}">
<Setter Property="OpenDropDownOnFocus" Value="True"/>
</Style>
</UserControl.Resources>
<Grid>
<telerik:RadGridView AutoGenerateColumns="False" Name="rgvData"
ItemsSource="{Binding Data}"
SelectedItem="{Binding SelectedData}">
<telerik:RadGridView.Resources>
..................................
答案 0 :(得分:1)
如果我将DataType指定为
{x:Type vm:DocumentViewModel}
的所有内容 工作得很好。 TabHeader绑定到TabControl的标题 - 它显示 来自 base ViewModel 的值。
听起来DataContext
中的项目实际上是DocumentViewModel
,而不是ProcurementViewModel
基础对象的隐式DataTemplate
也应该应用于从该类型继承的所有对象,但子对象的DataTemplates
将不适用于父对象。
因此,当您设置DocumentViewModel.TabHeader
时,您会看到 base DataType="{x:Type vm:DocumentViewModel}"
,这意味着您可能绑定到DocumentViewModel
对象,而不是ProcurementViewModel
1}}对象。
要确认是这种情况,您可以使用Snoop之类的第三方工具来查找运行时DataContext
对象的内容。
修改强>
根据您添加到问题中的新代码,最可能的原因是您的Tabs
集合(应用DataContext
的项目的DataTemplate
)不包含{{ 1}}对象。
您是否可以检查以确保您的ProcurementViewModel
集合包含Tabs
个对象,并且不仅包含ProcurementViewModel
个对象?
(此外,由于您的DocumentViewModel
相同且DataTemplates
继承自ProcurementViewModel
,因此您只需要DocumentViewModel
的{{1}}
答案 1 :(得分:0)
从我们可获得的有限信息来看,它看起来应该有效!检查派生VM的命名空间是否与基本VM的命名空间相同(或者,如果它们的目的不同,则您在XAML中具有适当的命名空间声明)。
另一种可能性是您在运行时实际上没有ProcurementViewModel
的任何实例,因此永远不会使用DataTemplate
。在此处仔细检查VM实例的运行时类型。
这些事情可能听起来很明显,但由于应该起作用,你需要在代码中寻找一些小的疏忽。
答案 2 :(得分:0)
处理此类问题的一个好方法是在运行时检查内容控件的DataContext属性。
这样做的好方法是使用可以在运行时检查绑定的工具。例如,您可以使用wpf检查器(http://wpfinspector.codeplex.com/)。