学习WPF之 Binding

最近在学习WPF,通过看书,敲代码和做笔记等各种方式.昨天学习完了Binding这一章... ... 画了张图进行总结,以备遗忘时查看.

1.Binding数据的校验

public _02Binding_ValidationRules()
        {
            InitializeComponent();
            Binding binding = new Binding("Value") { Source = slider1, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };

            RangeValidationRule rvr = new RangeValidationRule();
            rvr.ValidatesOnTargetUpdated = true;
            binding.ValidationRules.Add(rvr);
            binding.NotifyOnValidationError = true;

            textBox1.SetBinding(TextBox.TextProperty, binding);

            this.textBox1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError));
            //this.slider1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError2));
        }

        void ValidationError(Object sender, RoutedEventArgs e)
        {
            if (Validation.GetErrors(this.textBox1).Count > 0)
            { textBox1.ToolTip = Validation.GetErrors(this.textBox1)[0].ErrorContent.ToString(); }
        }  

    public class RangeValidationRule : ValidationRule
    {
        public override ValidationResult Validate(object value, CultureInfo cultureInfo)
        {
            double d;
            if (double.TryParse(value.ToString(), out d))
            {
                if (d >= 0 && d <= 100)
                {
                    return new ValidationResult(true, null);
                }
            }

            return new ValidationResult(false, "验证失败!");
        }
    }
 


2.Binding的数据转换

(效果图)

C#
  /// <summary>
    /// 种类
    /// </summary>
    public enum Category
    {
        Bomber,
        Fighter
    }

    /// <summary>
    /// 状态
    /// </summary>
    public enum State
    {
        Available,
        Locked,
        Unknown
    }

    /// <summary>
    /// 飞机类
    /// </summary>
    public class Plane
    {
        public string Name { get; set; }

        public Category Category { get; set; }

        public State State { get; set; }

    }  

C# 窗体.cs

 /// <summary>
        /// 给ListBox的ItemsSource属性赋值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonLoad_Click(object sender, RoutedEventArgs e)
        {
            ObservableCollection<Plane> planeList = new ObservableCollection<Plane>()
            {
                new Plane(){Category=Category.Bomber,Name="B-1",State=State.Unknown},
                new Plane(){Category=Category.Bomber,Name="B-2",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="F-22",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="Su-47",State=State.Unknown},
                new Plane(){Category=Category.Bomber,Name="B-52",State=State.Unknown},
                new Plane(){Category=Category.Fighter,Name="J-10",State=State.Unknown},
            };

            this.listBoxPlane.ItemsSource=planeList;

        }

        private void buttonSave_Click(object sender, RoutedEventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            foreach (Plane  p in listBoxPlane.Items)
            {
                sb.AppendLine(string.Format("Category={0},Name={1},State={2}",p.Category,p.Name,p.State));
            }
            File.WriteAllText(@"D:\PlaneList.txt",sb.ToString());
            MessageBox.Show("OK");
        }
 

C# 转换类 需要IValueConverter接口

Convert函数为源到目标时调用

ConvertBack函数为目标到源时调用

   public class CategoryToSourceConverter : IValueConverter
    {
        //将Category转换为Uri
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Category c = (Category)value;
            switch (c)
            {
                case Category.Bomber:
                    return @"Icons\Bomber.png";

                case Category.Fighter:
                    return @"Icons\Fighter.png";

                default:
                    return null;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

    public class StateToNullabelBoolConverter : IValueConverter
    {

        /// <summary>
        ///将State转换为Bool
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            State s = (State)value;
            switch (s)
            {
                case State.Available:
                    return true;
                case State.Locked:
                    return false;
                case State.Unknown:
                default:
                    return null;
            }
        }

        /// <summary>
        /// 将Bool转换为State
        /// </summary>
        /// <param name="value"></param>
        /// <param name="targetType"></param>
        /// <param name="parameter"></param>
        /// <param name="culture"></param>
        /// <returns></returns>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool? nb = (bool?)value;
            switch (nb)
            {
                case true:
                    return  State.Available;
                    case false:
                    return  State.Locked;
                    case null:
                          default:
                    return  State.Unknown;

            }
        }
    } 

Xaml

    <Window.Resources>
        <local:CategoryToSourceConverter x:Key="cts"/>
        <local:StateToNullabelBoolConverter x:Key="stnb"/>
    </Window.Resources>

    <StackPanel Background="LightBlue">
        <ListBox x:Name="listBoxPlane" Height="160" Margin="5">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Width="20" Height="20" Source="{Binding Path=Category,Converter={StaticResource cts}}"/>
                        <TextBlock Text="{Binding Path=Name}" Width=" 60" Margin="8,0"/>
                        <CheckBox IsThreeState="true" IsChecked="{Binding Path=State,Converter={StaticResource stnb}}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Button x:Name="buttonLoad" Content="Load" Height="25" Margin="5" Click="buttonLoad_Click"/>

        <Button x:Name="buttonSave" Content="Save" Height="25" Margin="5,5" Click="buttonSave_Click"/>

    </StackPanel>

3.MultiBinding(多路Binding)

C#
 namespace MyTestWPFApplication._2015年9月16日

{
    /// <summary>
    /// _04MultiBinding.xaml 的交互逻辑
    /// </summary>
    public partial class _04MultiBinding : Window
    {
        public _04MultiBinding()
        {
            InitializeComponent();
            SetMultiBinding();
        }

        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 };
            mb.Bindings.Add(b1);
            mb.Bindings.Add(b2);
            mb.Bindings.Add(b3);
            mb.Bindings.Add(b4);

            mb.Converter = new LogonMultiBindingConverter();
            button1.SetBinding(Button.IsEnabledProperty, mb);
        }
    }

 //因为这里的Converter类是是用来给MultiBinding的Converter来指定的.所以继承的接口不再是IValueConverter而是IMultiValueConverter
    class LogonMultiBindingConverter : 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
    <StackPanel Background="LightBlue">
        <TextBox x:Name="textBox1" Height="23" Margin="5,25,5,5" Width="140"/>
        <TextBox x:Name="textBox2" Height="23" Margin="5" Width="140"/>
        <TextBox x:Name="textBox3" Height="23" Margin="5" Width="140"/>
        <TextBox x:Name="textBox4" Height="23" Margin="5" Width="140"/>
        <Button x:Name="button1" Content="Submit" Width="80" Margin="5"></Button>
    </StackPanel>
 


Binding学完了!

时间: 2024-11-09 17:11:50

学习WPF之 Binding的相关文章

【转载一篇WPF之Binding】WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去改动,复用性也很高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定量的

跟着杨中科循序渐进学习wpf(全)

第一季 C#编程基础 1.用C#编写一个10+20=?的小程序: public static voidMain(tring[] args) { int i1=10; int i2=20; int i3=i1+i2; Console.WriteLine(i3);           //也可用占位符来实现:Console.WriteLine("{0}+{1}={2}",i1,i2,i1+i2);在输出参数较多时候要用占位符 Console.ReadKey();             

WPF之Binding深入探讨

1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都非常重要.但算法在3层中的分布是不均匀的,对于一个3层结构的程序来说,算法一般分布在这几处: A.数据库内部. B.读取和写回数据. C.业务逻辑. D.数据展示. E.界面与逻辑的交互. A,B两部分的算法一般都非常稳定,不会轻易去修改,复用性也非常高:C处与客户需求最紧密,最复杂,变化最大,大多少算法都集中在这里.D,E负责UI和逻辑的交互,也占有一定

WPF之Binding【转】

WPF之Binding[转] 看到WPF如此之炫,也想用用,可是一点也不会呀. 从需求谈起吧: 首先可能要做一个很炫的界面.见MaterialDesignInXAMLToolKit. 那,最主要的呢,还是想显示数据. 就先来数据,数据可以从数据库里得到,可是如何显示出来呢? 本文的主角出来了:(以下内容全转载他人,具体 原文见上面的链接) ==================================== 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.

WPF - Conditional binding with trigger

/* By Dylan SUN*/ WPF conditional binding enables the application to have different behaviors based on a pre-defined condition. For example, you could use conditional binding to change the background color of your WPF application main window. Suppose

【WPF】最近在学习wpf 的绑定,,

最近在学习wpf 的绑定,,1.简单的说就是版前端和后端用自己的方法给分开了2.baseVm 模型 baseCmd 命令3.命令传参修改的只是界面里的属性,而不修改其它的值4.前端改变后端, 后端改变前端要用的的函数 PropertyChanged 延伸出来的 OnProperyChanged 再延伸出来的 SetProperty5.前端和后端的分离,Interaction triggers in WPFhttp://www.cnblogs.com/lynn-/p/3262658.html <i

【转】WPF中Binding的技巧(一)

WPF中Binding的技巧(一) 在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. source = {binding} 和source = {binding RelativeSource={RelativeSource self},Path=DataContext}效果相同 理解:{binding} 不设定明确的绑定的source,这样bindin

WPF之Binding对数据的转换(第五天)

Binding在Slider控件与TextBox控件之间建立关联,值可以互相绑定,但是它们的数据类型是不同的,Slider是Double类型,Text为String.原来,Binding有一种机制称为数据转换(Data Converter),当数据绑定的源与目标不同类型时,处理比较简单时,系统就自动的进行了类型转换,但是对于相对复杂的类型转换时,就需要我们手动进行了. 下面用一个例子来说明Convert的应用,程序的用途是在列表里面向玩家显示一些球的状态. 首先创建几个自定义数据类型: publ

【WPF系列】基础学习-WPF架构

引言 WPF从.net framewok3.0加入以来,经历了很多跟新.每次更新都给用户带来了新的功能或者优化性能.下面我们首先看下WPF再.netFramework中的位置,接着介绍下WPF的架构框架.希望大家能够清楚WPF在.net framework中的位置,便于我们学习WPF时有个定性的认识. .net framework 特性变迁概览   图片来源http://en.wikipedia.org/wiki/.NET_Framework_version_history   WPF在.net