以下使用的参数:
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绑定 修改之后,绑定关系还在