扣扣技术交流群:460189483
一 绑定单个数据源:
1.1 绑定单个数据源,并绑定数据源的一个属性
XAML代码如下:将TextBlock绑定到了属性PrintTimes上
<TextBlock x:Name="TestTB" Text="{Binding PrintTimes}" Height="auto" Width="500" HorizontalAlignment="Center" />
后台CS端要将数据上下文DataContent与对应变量属性绑定,例如下
public class Test : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyChanged(string propertyName)
{
if(PropertyChanged != null)
{
PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
}
}
private string _PrintTimes;
private string _ShowTimes;
public Test()
{
_PrintTiimes="now";
}
public string PrintTimes
{
get{return _PrintTimes;}
set{
_PrintTimes=value;
NotifyChanged("PrintTimes");
}
}
public string ShowTimes
{
get{return _ShowTimes;}
set{
_ShowTimes=value;
NotifyChanged("ShowTimes");
}
}
}
namespace JointTest
{
public partial class MainWin : Window
{
public MainWin(Test test)
{
TestTB.DataContext=test; //将数据进行绑定
}
}
}
1.2 绑定单个数据源,并绑定数据源的2个属性
可以用如下代码实现
<TextBlock x:Name="TestTB" Height="auto" Width="500" HorizontalAlignment="Center" >
<Run Text="打印时间 = "/>
<Run Text="{Binding PrintTimes}"/>
<Run Text=", 显示时间 ="/>
<Run Text="{Binding ShowTimes}"/>
</TextBlock>
也可以使用如下实现
<TextBlock x:Name="TestTB" Height="auto" Width="500" HorizontalAlignment="Center">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} + {1}">
<Binding Path="PrintTimes" />
<Binding Path="ShowTimes" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
这里的 StringFormat="{}{0} + {1}" ,中的第一个{}是有必要存在的。最后得到的显示也就是<PrintTimes>+<ShowTimes>。
2. 绑定多个数据源:
2.1 本例4个TextBox(textBox1, textBox2, textBox3, textBox4)及一个按钮,当textBox1与textBox2内容相同,并且textBox3与textBox4内容相同时,Button有效。
一、方式一(通过C#进行绑定)
XAML代码如下:
<Grid>
<StackPanel>
<TextBox x:Name="TextBox1" Margin="5"/>
<TextBox x:Name="TextBox2" Margin="5"/>
<TextBox x:Name="TextBox3" Margin="5"/>
<TextBox x:Name="TextBox4" Margin="5"/>
<Button x:Name="btn_Commit" Content="Commit" Margin="5" Click="btn_Commit_Click" />
</StackPanel>
</Grid>
C#逻辑
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
SetMultiBinding();
}
private void btn_Commit_Click(object sender, RoutedEventArgs e)
{
}
private void SetMultiBinding()
{
Binding b1 = new Binding("Text") { Source = TextBox1 };
Binding b2 = new Binding("Text") { Source = TextBox2 };
Binding b3 = new Binding("Text") { Source = TextBox3 };
Binding b4 = new Binding("Text") { Source = TextBox4 };
MultiBinding mb = new MultiBinding() { Mode = BindingMode.OneWay };
/* MultiBinding对Add顺序敏感 */
mb.Bindings.Add(b1);
mb.Bindings.Add(b2);
mb.Bindings.Add(b3);
mb.Bindings.Add(b4);
mb.Converter = new MultiBindingConvert();
btn_Commit.SetBinding(Button.IsEnabledProperty, mb);
}
}
/* 多路绑定数据转换 */
public class MultiBindingConvert : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!values.Cast<string>().Any(text => string.IsNullOrEmpty(text))&&
values[0].ToString() == values[1].ToString() &&
values[2].ToString() == values[3].ToString()
)
{
return true;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
二、方式二(通过XAML绑定)
XAML代码如下:
<Window.Resources>
<local:LogonButtonEnableConvert x:Key="lbec"/>
</Window.Resources>
<Grid>
<StackPanel>
<TextBox x:Name="TextBox1" Margin="5"/>
<TextBox x:Name="TextBox2" Margin="5"/>
<TextBox x:Name="TextBox3" Margin="5"/>
<TextBox x:Name="TextBox4" Margin="5"/>
<Button x:Name="btn_Commit" Content="Commit" Margin="5" Click="btn_Commit_Click">
<Button.IsEnabled>
<MultiBinding Converter="{StaticResource lbec}" ConverterParameter="ParamTest">
<Binding ElementName="TextBox1" Path="Text"/>
<Binding ElementName="TextBox2" Path="Text"/>
<Binding ElementName="TextBox3" Path="Text"/>
<Binding ElementName="TextBox4" Path="Text"/>
</MultiBinding>
</Button.IsEnabled>
</Button>
</StackPanel>
</Grid>
2、C#数据转换类
public class LogonButtonEnableConvert : IMultiValueConverter
{
/*
* object[] values : 所绑定的源的值
* Type targetType : 目标的类型
* object parameter : 绑定时所传递的参数
* System.Globalization.CultureInfo culture : 系统语言等信息
*/
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (!values.Cast<string>().Any(text => string.IsNullOrEmpty(text))&&
values[0].ToString() == values[1].ToString() &&
values[2].ToString() == values[3].ToString()
)
{
return true;
}
return false;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
2.2 在XAML中使用MultiBinding+Converter
<Windows.Resourses>
<local:NameConverter x:key="myNameConverter"/>
</Windows.Resourses>
==============================================
<TextBlock x:Name="TestTB">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myNameConverter}"
ConverterParameter="FormatLastFirst">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
=======================================================
=======================================================
public class NameConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string name;
switch ((string)parameter)
{
case "FormatLastFirst":
name = values[1] + ", " + values[0];
break;
case "FormatNormal":
default:
name = values[0] + " " + values[1];
break;
}
return name;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
string[] splitValues = ((string)value).Split(' ');
return splitValues;
}
}
namespace JointTest
{
public partial class MainWin : Window
{
public MainWin(Test test)
{
btn_Commit.DataContext=test; //将数据进行绑定
}
}
}
xaml:
<TextBlock x:Name="TestTB" LineHeight="20" Height="auto" Width="500" HorizontalAlignment="Center" >
<TextBlock.Text>
<MultiBinding Converter="{StaticResource MultiStringStateConverter}" ConverterParameter="FormatLastFirst">
<Binding Path="ReceiptHeader"/>
<Binding Path="Receipt"/>
<Binding Path="LastPrintTime"/>
<Binding Path="PrintTimes"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
后台CS代码
public class MultiStringStateConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string Data;
switch ((string)parameter)
{
case "FormatLastFirst":
Data = values[0] + "" + values[1] + "打印时间:" + values[2] + "打印次数:" + values[3];
break;
case "FormatNormal":
default:
Data = values[0] + " " + values[1];
break;
}
return Data;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
//string[] splitValues = ((string)value).Split(' ');
//return splitValues;
}
}
namespace JointTest
{
public partial class MainWin : Window
{
public MainWin(Test test)
{
btn_Commit.DataContext=test; //将数据进行绑定
}
}
}
3.绑定静态变量
3.1 新建一个静态变量
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace WpfTestBindStaticField
{
public class StaticList
{
/// <summary>
/// 新建静态属性变更通知
/// </summary>
public static event EventHandler<PropertyChangedEventArgs> StaticPropertyChanged;
private static int _testValue = 0;
public static int TestValue
{
get
{
return _testValue;
}
set
{
_testValue = value;
//调用通知
StaticPropertyChanged?.Invoke(null, new PropertyChangedEventArgs(nameof(TestValue)));
}
}
}
}
3.2 前台给textblock绑定这个变量
<Window x:Class="WpfTestBindStaticField.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTestBindStaticField"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" Loaded="Window_Loaded">
<Window.Resources>
<local:StaticList x:Key="statisList"/>
</Window.Resources>
<Grid>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="60" Text="{Binding Source={StaticResource statisList},Path=TestValue}"/>
</Grid>
</Window>
3.3 测试后台改变这个变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
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 WpfTestBindStaticField
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
private static Random random = new Random();
private static Timer timer = null;
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
timer = new Timer(200);
timer.Elapsed += (o, f) =>
{
StaticList.TestValue = random.Next(0, 1000);
};
timer.Start();
}
}
}
测试结果