0

我有以下视图模型:

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>
..................................
4

3 回答 3

1

如果我指定 DataType{x:Type vm:DocumentViewModel}一切正常。TabHeader 绑定到 TabControl 的 Header -它显示来自基本ViewModel的值。

听起来您的项目DataContext实际上是 a DocumentViewModel,而不是 aProcurementViewModel

基础对象的隐式DataTemplate也应该应用于从该类型继承的所有对象,但是DataTemplates对于子对象不会应用于父对象。

因此,由于您在设置 时看到了基础 ,这意味着您可能绑定到一个对象,而不是一个对象。DocumentViewModel.TabHeaderDataType="{x:Type vm:DocumentViewModel}"DocumentViewModelProcurementViewModel

要确认是这种情况,您可以使用Snoop之类的第 3 方工具来找出您的DataContext对象在运行时是什么。

编辑:

根据您添加到问题中的新代码,最可能的原因是您的Tabs集合(DataContext应用 的项目DataTemplate)不包含ProcurementViewModel对象。

您能否检查以确保您的Tabs集合包含一个ProcurementViewModel对象,而不仅仅是包含DocumentViewModel对象?

(此外,由于您DataTemplates的相同并且ProcurementViewModel继承自DocumentViewModel,因此您只需要DataTemplatefor DocumentViewModel

于 2013-01-28T17:27:43.810 回答
0

从我们可获得的有限信息来看,看起来这应该可行!检查派生 VM 的命名空间是否与基础 VM 的命名空间相同(或者,如果它们故意不同,则您在 XAML 中具有适当的命名空间声明)。

另一种可能性是您实际上ProcurementViewModel在运行时没有任何实例,因此DataTemplate从未使用过。在此处仔细检查您的 VM 实例的运行时类型。

这些事情听起来很明显,但由于这应该有效,因此您需要在代码中寻找一些小的疏忽。

于 2013-01-28T16:45:34.760 回答
0

处理此类问题的一种好方法是在运行时检查内容控件的 DataContext 属性。

一个很好的方法是使用可以在运行时检查绑定的工具。例如,您可以使用 wpf 检查器 ( http://wpfinspector.codeplex.com/ )。

于 2013-01-28T17:10:53.707 回答