数据提供类ObjectDataProvider和XMLDataProvider

ObjectDataProvider

(1)基本使用

这个ObjectDataProvider东西真的是个神奇的存在。等同于反射。只不过是写在xaml中。

例如说我要把colors中所有的颜色列举出来:

普通方法:

 //CB是combobox
            this.CB.ItemsSource = typeof(Colors).GetProperties();

使用objectdataprovider则为:

    
        "ODP" ObjectInstance="{x:Type Colors}" MethodName="GetProperties"/>
    
    
        "120" x:Name="CB" ItemsSource="{Binding Source={StaticResource ODP}}"/>
    

从编写的代码数量来说,C#要简单一点。不过对于习惯编写xaml和必须在xaml中使用时objectdataprovider要更加方便。objectdataprovider可以让方法绑定到控件,准确的说是方法的结果。

假如说有一个类,有一个方法且有两个参数此方法会返回这两个数的和。

 public class A
    {

        public int ADD(int a, int b) => a + b;

    }

        "ODP"  ObjectType="{x:Type local:A}" MethodName="ADD">
            
                12
                12
            
        
    
    
        "{Binding Source={StaticResource ODP}}"/>
    

或是

 
       "A"/>
        "GetAdd" ObjectInstance="{StaticResource A}"  MethodName="ADD"   >
            
                1
                1
            
        
    


    
        "{Binding Source={StaticResource GetAdd}}"/>
    

ObjectInstance和ObjectType只有其中一个可以赋值。

ObjectType的类型是Type

ObjectInstance的类型是Object

换句话说objecttype可以使用x:type进行赋值,也只有这种方式。

objectinstance则是可以通过staticresource的方式进行绑定,绑定的也是实例化后的元素。

把类修改为:

 public class A
    {
        private int a;
        private int b;
        public A(int a,int b)
        {
            this.a = a;
            this.b = b;
        }
        public A()
        {

        }
        public int ADD(int a, int b) => a + b;

        public int ADD() => this.a + this.b;
    }

有了构造函数和重载方法。xaml中如果想要使用构造函数和重载方法则是需要这么写:


        "GetAdd"  ObjectType="{x:Type local:A}" MethodName="ADD"   >
            
                3
                1
            
        
    
    
        "{Binding Source={StaticResource GetAdd}}"/>
    

最后值得注意的是MethodParameters这个属性是不支持直接绑定的。但是却可以这么操作:

  public class A
    {
        private int a;
        private int b;
        public A(int a,int b)
        {
            this.a = a;
            this.b = b;
        }
        public A()
        {

        }
        public int ADD(int a, int b) => a + b;

        public int ADD() => this.a + this.b;

        public string ADD(string A, string B) => A + B;
    }

        "A"/>
        "GetAdd"  ObjectType="{x:Type local:A}"  MethodName="ADD"   >
            
                A
                B
            
        
    
    
        
            "*"/>
            "*"/>
            "*"/>
        
        "0" Text="{Binding Source={StaticResource GetAdd}, Path=MethodParameters[0],UpdateSourceTrigger=PropertyChanged,BindsDirectlyToSource=True}"/>
        "1" Text="{Binding Source={StaticResource GetAdd}, Path=MethodParameters[1],UpdateSourceTrigger=PropertyChanged,BindsDirectlyToSource=True}"/>
        "2" Text="{Binding Source={StaticResource GetAdd}}"/>
    

 (2)异步使用

 

  同步如下:

"WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    
        "ODP"  ObjectType="{x:Type local:A}" MethodName="ADD" >
            
                12
                12
            
        
    
    
        
            "254*"/>
            "263*"/>
        
        "{Binding Source={StaticResource ODP}}" />
    
  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

     public class A
    {
         public int ADD(int a, int b)
         {
             Thread.Sleep(5000);
             return a + b;
         }

    }

效果是:卡了5秒窗体才会出现,同时textblock出现数值;

 

改成异步:只需要设置ObjectDataProvider 的IsAsynchronous="True"

 "ODP"  ObjectType="{x:Type local:A}" MethodName="ADD" IsAsynchronous="True" >
            
                12
                12
            
        

效果:窗体立即出现,5秒后textBlock出现数值;

 引用WPF编程宝典的部分内容:

 数据提供类ObjectDataProvider和XMLDataProvider_第1张图片

 

 数据提供类ObjectDataProvider和XMLDataProvider_第2张图片

 

 XNLDataProvider

默认情况下XNLDataProvider是异步的加载XML内容,除非显示的设置XNLDataProvider.IsAsynchronous=false

使用示例:

XMLFile1.xml

 

"1.0" encoding="utf-8" ?>

  
    355
    test
    23
  
  
    356
    test1
    25
  

 

"WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    
        "productsProvider" Source="XMLFile1.xml" XPath="/Products"  >
    
    
        "{Binding Source={StaticResource productsProvider},XPath=Product}" >
            
                
                    "Horizontal">
                        "{Binding XPath=Name}">
                        "{Binding XPath=Age}">
                    
                
            
        
    

数据提供类ObjectDataProvider和XMLDataProvider_第3张图片

 

 

 

你可能感兴趣的:(数据提供类ObjectDataProvider和XMLDataProvider)