【发布时间】:2013-03-11 07:29:42
【问题描述】:
我想为库存管理创建一个向导 UI。 xaml 中的相关行是:
<ContentPresenter Content="{Binding Current}" ContentTemplateSelector="{StaticResource inventorySelector}"/>
“Current”是当前活动的视图模型,AvailableInventoriesViewModel、GroupsViewModel、NewArticlesViewModel、ResultViewModel 之一。我这样定义的 DataTemplateSelector:
using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using Centron.WPF.WarehousingExtension.InventoryModule.ViewModels.WizardViewModels;
namespace Centron.WPF.WarehousingExtension.InventoryModule.UI.DataTemplateSelectors
{
public class InventoryDatatemplateSelector : DataTemplateSelector
{
public DataTemplate AvailableDatatype { get; set; }
public DataTemplate GroupsDatatype { get; set; }
public DataTemplate NewDatatype { get; set; }
public DataTemplate ResultDatatype { get; set; }
public InventoryDatatemplateSelector()
{
Debug.WriteLine("");
}
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item is AvailableInventoriesViewModel)
return AvailableDatatype;
else if (item is GroupsViewModel)
return GroupsDatatype;
else if (item is NewArticlesViewModel)
return NewDatatype;
else return ResultDatatype;
}
}
}
然后我像这样创建 DataTemplates 和 Selector 的实例:
<base:InventoryViewBase.Resources>
<DataTemplate DataType="viewModels:AvailableInventoriesViewModel" x:Key="availableInventoriesDatatype">
<controls:AvailableInventoriesView />
</DataTemplate>
<DataTemplate DataType="viewModels:GroupsViewModel" x:Key="groupsDatatype">
<controls:GroupsView />
</DataTemplate>
<DataTemplate DataType="viewModels:NewArticlesViewModel" x:Key="newArticlesDatatype">
<controls:NewArticlesView />
</DataTemplate>
<DataTemplate DataType="viewModels:ResultViewModel" x:Key="resultDatatype">
<controls:ResultView/>
</DataTemplate>
<selector:InventoryDatatemplateSelector
x:Key="inventorySelector"
AvailableDatatype="{StaticResource availableInventoriesDatatype}"
GroupsDatatype="{StaticResource groupsDatatype}"
NewDatatype="{StaticResource newArticlesDatatype}"
ResultDatatype="{StaticResource resultDatatype}"/>
</base:InventoryViewBase.Resources>
我在我的 InventoryDatatemplateSelector 的构造函数中设置了一个断点,并且可以单步执行它,但是在下一个 Debug 步骤中,显然当它尝试设置该选择器实例的第一个属性时,我立即得到一个带有内部异常的异常:
找不到名为“availableInventoriesDatatype”的资源。资源名称区分大小写。
怎么回事,为什么明确定义的资源却找不到?
【问题讨论】:
-
您可能不知道导致此问题的几件事。首先,xaml(除了极少数例外)从上到下解析并转换为对象图。这意味着顺序很重要。其次,DataTemplate 的设计目的是让它们根据
DataType为自己分配一个 Key,这(本质上)取代了 x:Key 属性。所以,如果你想定义一个同时包含 DataType(在你使用它时完全没有必要)和一个 x:Key 的 DataTemplate,你必须把 x:Key 放在第一位。是的,令人困惑,但这是因为使 DT 更易于使用。