WPP多重值绑定
以下使用的参数:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace XH.BindingLesson.OtherBindings
{public class Data{//public int Value { get; set; } = 123;private int _value = 123;public int Value{get { return _value; }set { _value = value; }}//public string Value2 { get; set; } = "Hello";private string _value2 = "Hello";public string Value2{get{Thread.Sleep(2000);return _value2;}set{_value2 = value;}}private double _progressValue = 0.25;public double ProgressValue{get { return _progressValue; }set { _progressValue = value; }}private int _value1 = 100;public int Value1{get{Thread.Sleep(3000);return _value1;}set{_value1 = value;}}private int _value3 = 300;public int Value3{get{Thread.Sleep(1000);return _value3;}set{_value3 = value;}}}
}
MultiBinding 多重绑定基本使用
需求:在一次绑定中,如果一个控件需要给很多属性进行绑定,就可以使用多重数据绑定
<TextBlock><TextBlock.Text><!--多重绑定 可以根据下表进行顺序显示--><MultiBinding StringFormat="{}{1}{0}"><Binding Path="Value" /><Binding Path="Value2" /></MultiBinding></TextBlock.Text></TextBlock>
多重绑定 可以根据StringFormat来改变显示顺序
显示结果为:
MultiBinding Converter 多重值转换器
需求:如果转换的时候不仅仅是显示,还需要计算,则需要使用Converter
C#代码:转换器代码:
需要继承:IMultiValueConverter
using System.Globalization;
using System.Windows.Data;namespace XH.BindingLesson.OtherBindings
{public class CombinValueConverter : IMultiValueConverter{// 源到目标public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){string v = string.Empty;foreach (var item in values){v += item+",";}return v.TrimEnd(',');}// 目标到源public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){string[] str = value.ToString().Split(',');object[] result = new object[str.Length];result[0] = int.Parse(str[0].ToString());result[1] = str[1].ToString();return result;}}
}
XAML使用代码:
<Window.Resources><local:CombinValueConverter x:Key="cvc" />
</Window.Resources>
…………………………
<TextBox><TextBox.Text><!--绑定显示转换器--><MultiBinding Converter="{StaticResource cvc}"><Binding Path="Value" /><Binding Path="Value2" /></MultiBinding></TextBox.Text>
</TextBox>
显示结果一样
使用案例:
需求:我需要在一个border1中设置一个border2,但是这个border2的宽度是border1的百分比(参数),请问怎么写?需要多重数据绑定:
XAML使用代码:
<Window.Resources><local:WidthValueConverter x:Key="wvc" />
</Window.Resources>
……………………………………
<!--多重绑定实现子控件长度是父控件的百分比--><Border Height="20" Background="Gray" Margin="30 10" Name="bor" ><Border Background="Orange" HorizontalAlignment="Left"><Border.Width><MultiBinding Converter="{StaticResource wvc}"><Binding Path="ProgressValue" /><Binding ElementName="bor" Path="ActualWidth" /></MultiBinding></Border.Width></Border></Border>
C#转换器代码:
using System.Globalization;
using System.Windows.Data;namespace XH.BindingLesson.OtherBindings
{public class WidthValueConverter : IMultiValueConverter{public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture){return double.Parse(values[0].ToString()) * double.Parse(values[1].ToString());}public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture){throw new NotImplementedException();}}
}
效果如下: ProgressValue == 0.25
PriorityBinding 优先级绑定 了解
使用场景不多,会用就行
IsAsync 需要打开异步属性
<TextBlock.Text><PriorityBinding><Binding Path="Value2" IsAsync="True" /><Binding Path="Value3" IsAsync="True" /><Binding Path="Value1" IsAsync="True" /></PriorityBinding>
</TextBlock.Text>
注意:需要在C#Get属性的地方添加延时
ClearBinding 绑定关系清除 了解
C#代码:
// 删除所有绑定关系
BindingOperations.ClearAllBindings(this.tb);
// 删除特定的绑定关系
BindingOperations.ClearBinding(this.tb,TextBox.TextProperty);
注意:
TextBlock Text 默认是OneWay绑定 修改之后,绑定关系不在,除非修改绑定关系
TextBox Text 默认是TwoWay绑定 修改之后,绑定关系还在