c# ObjectDataProvider

参考:
1,https://blog.csdn.net/sl1990129/article/details/81868784
2,https://blog.csdn.net/sl1990129/article/details/81868784

cs实现ObjectDataProvider数据绑定

.CS

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ObjectDataProvider ob = new ObjectDataProvider();

            ob.ObjectInstance = new MyClass();
            ob.MethodName = "Add";//方法名
            ob.MethodParameters.Add("0");//"0"是字符型,于是可以区分add重载
            ob.MethodParameters.Add("0");

            Binding bindingToArg1 = new Binding("MethodParameters[0]"){Source = ob,BindsDirectlyToSource = true,UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged};

            Binding bindingToArg2 = new Binding("MethodParameters[1]")
            {
                Source = ob,
                BindsDirectlyToSource = true,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
            };

            Binding bindingToResult = new Binding(".") {Source = ob};//这里path为.表示即数据源时ob对象本身

            this.textBox1.SetBinding(TextBox.TextProperty, bindingToArg1);
            this.textBox2.SetBinding(TextBox.TextProperty, bindingToArg2);
            this.textBox3.SetBinding(TextBox.TextProperty, bindingToResult);
        }
    }
    internal class MyClass
    {
        public string Add(string arg1, string arg2)
        {
            double x = 0;
            double y = 0;
            double z = 0;
            double.TryParse(arg1, out x);
            double.TryParse(arg2, out y);
            z = x + y;
            return z.ToString();
        }
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}

.xmal

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="77,52,0,0" Name="textBox1" VerticalAlignment="Top" Width="362" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="77,118,0,0" Name="textBox2" VerticalAlignment="Top" Width="362" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="77,184,0,0" Name="textBox3" VerticalAlignment="Top" Width="362" />
    </Grid>
</Window>

个人理解:ObjectDataProvider可以实现成员函数返回值的绑定

xaml内实现Binding表达式

.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication4
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
    internal class MyClass
    {
        public string Add(string arg1, string arg2)
        {
            double x = 0;
            double y = 0;
            double z = 0;
            double.TryParse(arg1, out x);
            double.TryParse(arg2, out y);
            z = x + y;
            return z.ToString();
        }
       
    }
}

.xaml

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication4"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
       <Window.Resources>
        <ObjectDataProvider x:Key="ob" ObjectType="{x:Type local:MyClass}" MethodName="Add">
            <ObjectDataProvider.MethodParameters>
                <system:String>0</system:String>
                <system:String>0</system:String>
            </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
    </Window.Resources>
    <StackPanel>
        <TextBox Margin ="10" Text="{Binding Source={StaticResource ob},Path=MethodParameters[0],BindsDirectlyToSource = true,UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Margin="10">
            <TextBox.Text>
                <Binding Source="{StaticResource ob}" Path="MethodParameters[0]" BindsDirectlyToSource ="True" UpdateSourceTrigger="PropertyChanged"></Binding>
            </TextBox.Text>
        </TextBox>
        <TextBox Margin ="10" Text="{Binding Source={StaticResource ob},Mode=OneWay}"/>
    </StackPanel>
</Window>

其中<TextBox Margin ="10" Text="{Binding Source={StaticResource ob},Mode=OneWay}"/>如果不指定Mode=OneWay会抛出异常!

这里是没有path 但有source的xaml绑定语法

Text="{Binding Source={StaticResource ob},Mode=OneWay}"

题外话:要是没有source只有path的绑定语法写法如下:

Text="{Binding ID,Mode=OneWay}"

猜你喜欢

转载自blog.csdn.net/qq_37627370/article/details/83415465
C#