当前位置:  开发笔记 > 编程语言 > 正文

我可以在XAML(.NET 4 Framework之前版本)中指定泛型类型吗?

如何解决《我可以在XAML(.NET4Framework之前版本)中指定泛型类型吗?》经验,为你挑选了4个好方法。

在XAML中,我可以声明一个DataTemplate,以便在显示特定类型时使用该模板.例如,此DataTemplate将使用TextBlock显示客户的名称:


    

我想知道是否可以定义一个将在IList 显示时使用的DataTemplate.因此,如果ContentControl的内容是ObservableCollection ,它将使用该模板.

是否可以使用{x:Type}标记扩展在XAML中声明类似IList的泛型类型?



1> Ian Oakes..:

不是直接在XAML中,但您可以DataTemplateSelector从XAML 引用选择正确的模板.

public class CustomerTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item,
                                                DependencyObject container)
    {
        DataTemplate template = null;
        if (item != null)
        {
            FrameworkElement element = container as FrameworkElement;
            if (element != null)
            {
                string templateName = item is ObservableCollection ?
                    "MyCustomerTemplate" : "YourCustomerTemplate";

                template = element.FindResource(templateName) as DataTemplate;
            } 
        }
        return template;
    }
}

public class MyCustomer
{
    public string CustomerName { get; set; }
}

public class YourCustomer
{
    public string CustomerName { get; set; }
}

资源字典:


    
        
            
                
                
            
            
            
        
    

    
        
            
                
                
            
            
            
        
    

窗口XAML:


    
        
            
        
        
    

后面的窗口代码:

public partial class Window1
{
    public Window1()
    {
        InitializeComponent();
        ObservableCollection myCustomers
            = new ObservableCollection()
        {
            new MyCustomer(){CustomerName="Paul"},
            new MyCustomer(){CustomerName="John"},
            new MyCustomer(){CustomerName="Mary"}
        };

        ObservableCollection yourCustomers
            = new ObservableCollection()
        {
            new YourCustomer(){CustomerName="Peter"},
            new YourCustomer(){CustomerName="Chris"},
            new YourCustomer(){CustomerName="Jan"}
        };
        //DataContext = myCustomers;
        DataContext = yourCustomers;
    }
}



2> ageektrapped..:

没有开箱即用,没有; 但是那些有进取心的开发人员已经这样做了.

例如,微软的迈克希尔伯格在这篇文章中用它来玩.Google当然还有其他人.



3> Claudiu Miha..:

您还可以将通用类包装在指定T的派生类中

public class StringList : List{}

并使用XAML中的StringList.



4> cplotts..:

aelij(WPF Contrib项目的项目协调员)有另一种方法可以做到这一点.

什么甚至更酷(即使将来某个时候关闭)...是XAML 2009(XAML 2006是当前版本)本来会支持这个.查看此PDC 2008会话以获取有关它的信息等.


在松散的xaml文件中仅支持XAML 2009(从.NET 4.0开始,WPF 4.0).也就是说,Blend,Cider(Visual Studio设计器)和编译的BAML(这是嵌入式xaml编译成的)...不支持新语法.希望这将在未来版本的WPF中发生变化.请参阅以下链接并投票:http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/478860-support-xaml2009-throughout#ref=title
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有