我有一个非常奇怪的问题。我写的应用程序使用wpf,telerik(office2007主题)。我使用DataTemplateSelector为不同类型的模型动态创建视图。在Windows7下一切正常,但在Windows8下DataTemplateSelector就不能工作了!见鬼?你能帮我解决我的问题吗?
public class TabDataTemplateSelector:DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if(item==null || container == null)
return null;
FrameworkElement element = Application.Current.MainWindow as FrameworkElement;
if (element == null)
return null;
if (item is PetrochemicalCatalogViewModel)
{
return element.FindResource("PetrochemicalCatalogDataTemplate") as DataTemplate;
}
if (item is FuelPriceViewModel)
{
return element.FindResource("FuelPriceDataTemplate") as DataTemplate;
}
if (item is RoleViewModel)
{
return element.FindResource("RoleDataTemplate") as DataTemplate;
}
if (item is IEquipmentViewModel)
{
return element.FindResource("EquipmentDataTemplate") as DataTemplate;
}
if (item is IZondsViewModel)
{
return element.FindResource("ZondDataTemplate") as DataTemplate;
}
if (item is ITankCatalogViewModel)
{
return element.FindResource("TanksDataTemplate") as DataTemplate;
}
if (item is IDispensersWorkplaceViewModel)
{
return element.FindResource("DispensingDataTemplate") as DataTemplate;
}
if (item is IDispenserSetsWorkplaceViewModel)
{
return element.FindResource("DispenserSetsWorkplaceTemplate") as DataTemplate;
}
if (item is IPaymentTypeCatalogViewModel)
{
return element.FindResource("PaymentTypeWorkplaceTemplate") as DataTemplate;
}
if (item is ICashManagementViewModel)
{
return element.FindResource("CashManagementTemplate") as DataTemplate;
}
if (item is ITerminalWorkplaceViewModel)
{
return element.FindResource("TerminalDataTemplate") as DataTemplate;
}
if (item is IPriceingWorkplaceViewModel)
{
return element.FindResource("PriceingDataTemplate") as DataTemplate;
}
return null;
}
}
<local:TabDataTemplateSelector x:Key="tabDataTemplateSelector"/>
<DataTemplate x:Key="TabContentTemplate">
<telerik:RadBusyIndicator x:Name="rbiBusy" VerticalAlignment="Stretch" IsBusy="{Binding IsBusy}" HorizontalContentAlignment="Stretch" telerik:StyleManager.Theme="Windows8Touch" VerticalContentAlignment="Stretch">
<ContentPresenter ContentTemplateSelector="{StaticResource tabDataTemplateSelector}" Content="{Binding TabContentViewModel}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</telerik:RadBusyIndicator>
</DataTemplate>发布于 2013-11-16 19:28:20
Windows7和Windows8有点不同。我也遇到了同样的问题,我发现Windows8不支持DataTemplate的DataType属性,所以我不得不根据它们的名称选择它,并使用一个自定义的DataTemplateSelector。下面是我的代码的摘录,其中一个列表填充了不同的类型:
XAML:
<UserControl.Resources>
<s:CustomDataTemplateSelector
x:Key="CustomDataTemplateSelector" />
<DataTemplate
x:Key="Activity1">
<c:ActivityControl1 />
</DataTemplate>
<DataTemplate
x:Key="Activity2">
<c:ActivityControl2 />
</DataTemplate>
</UserControl.Resources>
<Grid>
<ListView
FontSize="20"
BorderThickness="0"
Foreground="Black"
ItemsSource="{Binding Activities}"
HorizontalContentAlignment="Stretch"
ItemTemplateSelector="{StaticResource CustomDataTemplateSelector}" />
</Grid>政务司司长:
public class CustomDataTemplateSelector : DataTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
string key = item.GetType().Name;
FrameworkElement element = container as FrameworkElement;
while (element != null)
{
if (element.Resources.ContainsKey(key))
return element.Resources[key] as DataTemplate;
element = VisualTreeHelper.GetParent(element) as FrameworkElement;
}
return Application.Current.Resources[key] as DataTemplate;
}
}希望这能有所帮助。
发布于 2013-10-23 16:08:12
执行所需操作的标准方法是将每个DataTemplate放入一个UserControl中(不带DataTemplate对象,例如:只需添加内容),将它们命名为...View (其中'...‘来自相关的视图模型类),并使用App.xaml中定义的DataTemplate将它们连接到视图模型。
<DataTemplate DataType="{x:Type ViewModels:PetrochemicalCatalogViewModel}">
<Views:PetrochemicalCatalogView />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModels:FuelPriceViewModel}">
<Views:FuelPriceView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:IPriceingWorkplaceViewModel}">
<Views:IPriceingWorkplaceView />
</DataTemplate>https://stackoverflow.com/questions/19310639
复制相似问题