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绑定 修改之后,绑定关系还在

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值