WPF TextBlock的数据绑定

扣扣技术交流群: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();
        }
    }
}

测试结果

 

 

 

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值