首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DataTemplateSelector和Windows8

DataTemplateSelector和Windows8
EN

Stack Overflow用户
提问于 2013-10-11 13:09:32
回答 2查看 566关注 0票数 0

我有一个非常奇怪的问题。我写的应用程序使用wpf,telerik(office2007主题)。我使用DataTemplateSelector为不同类型的模型动态创建视图。在Windows7下一切正常,但在Windows8下DataTemplateSelector就不能工作了!见鬼?你能帮我解决我的问题吗?

代码语言:javascript
复制
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>
EN

回答 2

Stack Overflow用户

发布于 2013-11-16 19:28:20

Windows7和Windows8有点不同。我也遇到了同样的问题,我发现Windows8不支持DataTemplate的DataType属性,所以我不得不根据它们的名称选择它,并使用一个自定义的DataTemplateSelector。下面是我的代码的摘录,其中一个列表填充了不同的类型:

XAML:

代码语言:javascript
复制
<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>

政务司司长:

代码语言:javascript
复制
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;
    }
}

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2013-10-23 16:08:12

执行所需操作的标准方法是将每个DataTemplate放入一个UserControl中(不带DataTemplate对象,例如:只需添加内容),将它们命名为...View (其中'...‘来自相关的视图模型类),并使用App.xaml中定义的DataTemplate将它们连接到视图模型。

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19310639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档