参考:
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}"