Binding 是前台UI(显示层)和后台代码(数据层)的桥梁。理论上当后台的数据变动时,显示的数据或样式应该随之而变。这些是动态的。

对于Binding的设置可以在前台Xaml,也可以在后台Code里面定义,但是既然Xaml可以做很多事情,那么所有对UI的操作我们都可以交给它。

其实,WPF的本身是一种数据驱动UI的设计模式,使用了MVVM(Model-View-ViewModel)的模式。

以下是绑定的基本思路:

目标(依赖对象(依赖属性))  <=====Binding =====> 源(CLR 对象(属性))

实验1:

设计一个圆形的球,包括红球和篮球,有编号。初始状态为灰色,当选中时,红球颜色显示为红,篮球颜色显示为蓝。再次选中时,颜色返回为初始状态(灰色)

另外,当球被选中时,可以处理一下数据,如读取编号。

思路:

1.首先设计一个Ball 类 包含了IsSelected, Type, Index 属性,并继承了INotifyPropertyChanged接口,当IsSelected属性变更的时候,产生了PropertyChanged的Event。

2.创建了一个BallControl的 User Control (WPF).

3.bindingBall类到BallControl上。对binding做一些设定,从而实现实验1的需求。

实现:

1. 新建Ball类. 实现INotifyPropertyChanged 接口,当属性IsSelected值变化的时候,调用PropertyChanged event

    public class Ball : INotifyPropertyChanged
{
/// <summary>
/// Fired whenever a property changes. Required for
/// INotifyPropertyChanged interface.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged; private bool selected; private BallType type; private int index; private Point size; public Ball()
:this(false, BallType.gray, , new Point(,))
{
} public Ball(bool ballIsSelected, BallType ballType, int ballIndex, Point ballSize)
{
this.selected = ballIsSelected;
this.type = ballType;
this.index = ballIndex;
this.size = ballSize;
} public bool IsSelected
{
get
{
return this.selected;
} set
{
if (value != this.selected)
{
this.selected = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs("IsSelected"
));
}

}
}
} public BallType Type
{
get
{
return this.type;
}
} public int Index
{
get
{
return this.index;
}
}
} public enum BallType
{
gray, Red, Blue,
}

2. 新建一个User Control (WPF), 名为BallControl,依次放入Grid, Border, Ellipse, TextBlock 控件. 完成 UI 布局。

在后台为鼠标点击动作添加一个Event,当Ball控件被点击选择的时候,会做一些需要的处理。

<UserControl x:Name="myBallControl"
x:Class="BallSelection.BallControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BallSelection"
mc:Ignorable="d"
Height="100"
Width="100">
<Grid Height="100"
Width="100"
VerticalAlignment="Top"
MouseDown="UIElement_OnMouseDown"
>
<Border BorderBrush="Black"
BorderThickness="1"
HorizontalAlignment="Left"
Width="100"
Height="100"
RenderTransformOrigin="0.481,0.183">
<Ellipse x:Name="circle"
Stroke="Black"
Margin="6,6,6,6">
</Ellipse>
</Border>
<TextBlock x:Name="tbIndex"
Text="0"
FontSize="58"
VerticalAlignment="Center"
HorizontalAlignment="Center" />
</Grid>
</UserControl>
    /// <summary>
/// Interaction logic for BallControl.xaml
/// </summary>
public partial class BallControl : UserControl
{
public event EventHandler<EventArgs> SelectionChanged; public BallControl()
{
InitializeComponent();
} private void UIElement_OnMouseDown(object sender, MouseButtonEventArgs e)
{
if (this.SelectionChanged != null)
{
this.SelectionChanged(this
, EventArgs.Empty);
}
}

}

4. 设计MainWindow的UI,依次放入Grid,WrapStack,和BallControl。

<Window x:Class="BallSelection.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:BallSelection"
Title="MainWindow"
Height=""
Width="">
<Grid>
<Grid HorizontalAlignment="Left"
Height=""
Margin="51,38,0,0"
VerticalAlignment="Top"
Width="">
<WrapPanel x:Name="wpBalls"
HorizontalAlignment="Left"
Height=""
VerticalAlignment="Top"
Width="">
<local:BallControl x:Name="redBallControl" />
<local:BallControl x:Name="blueBallControl" />

</WrapPanel>
</Grid>
</Grid>
</Window>

5. 进行Binding, 有两种方法:一种是在后台Code里面进行binding, 另外一种是在前台Xaml里面进行binding。

方法一:在后台Code里面进行binding

 public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); this.InitializeBalls();
} private void InitializeBalls()
{
Ball redBall = new Ball(false, BallType.Red, , new Point(,)); Binding bindingIndex = new Binding()
{
Source = redBall,
Path = new PropertyPath("Index")
}; // this is equal to: this.blueBallControl.tbIndex.SetBinding(TextBlock.TextProperty, bindingIndex);
BindingOperations.SetBinding(this.redBallControl.tbIndex, TextBlock.TextProperty, bindingIndex); Binding bindingSelect = new Binding()
{
Source = redBall,
Path = new PropertyPath("IsSelected"),
Converter = new BooleanToColor(),
}; BindingOperations.SetBinding(this.redBallControl.circle, Ellipse.FillProperty, bindingSelect); // Handle selection changed event.
this.redBallControl.SelectionChanged += ((s, e) =>
{
redBall.IsSelected = !redBall.IsSelected;
MessageBox.Show(string.Format("BallControl Index {0} is selected.\t\n. Ball Type:{1}, Index:{2}, IsSelected:{3}.", this.redBallControl.tbIndex.Text, redBall.Type.ToString(), redBall.Index, redBall.IsSelected));
});
} }

这里在binding的过程中,当ball control被选中的时候, 颜色会自动进行转换,所以需要一个Converter。

    public class BooleanToColor : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (targetType != typeof(Brush))
throw new InvalidOperationException("The target must be a Brush"); if (value == null)
return Brushes.Gray; return (bool)value ? Brushes.Red : Brushes.Gray;
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}

方法二:在前台Xaml里面进行binding

(待续)

(WPF) 再议binding:点击User Control时,User Control变换颜色或做其他的处理。的更多相关文章

  1. Easyui之datagrid实现点击单元格修改单元格背景颜色

    前段时间有个需求中有点击datagrid的单元格实现某种事件,调用datagrid的onclickCell这个方法很容易实现,但是体验不好啊,完全不知道自己刚才点击的是哪个单元格,然后就尝试单击单元格 ...

  2. 【转】WPF中的Binding技巧(二)

    WPF中的Binding技巧(二)     接上篇, 我们来看一看Elementname,Source,RelativeSource 三种绑定的方式 1.ElementName顾名思义就是根据Ui元素 ...

  3. 再议 js 数字格式之正则表达式

    原文:再议 js 数字格式之正则表达式 前面我们提到到了js的数字格式<浅谈 js 数字格式类型>,之前的<js 正则练习之语法高亮>里也提到了优化数字匹配的正则.不过最近落叶 ...

  4. Python学习之再议row_input

    再议raw_input birth = raw_input('birth: ') if birth < 2000: print '00前' else: print '00后' 运行结果: bir ...

  5. 再议Java中的static关键字

    再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...

  6. VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法。

    原文:VS编程,编辑WPF过程中,点击设计器中界面某一控件,在XAML中高亮突出显示相应的控件代码的设置方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net ...

  7. 再议perl写多线程端口扫描器

    再议perl写多线程端口扫描器 http://blog.csdn.net/sx1989827/article/details/4642179 perl写端口多线程扫描器 http://blog.csd ...

  8. Control.Invoke和Control.BeginInvoke

    问题的引入 下面有个简单的demo,大家一看代码就知道效果如何示例.我新建一个winform的程序,然后写入了如下代码: using System; using System.Windows.Form ...

  9. 微信6.7.4 ios12 软键盘收回时页面不回弹,导致光标位置错乱,再次点击输入框区域时无法focus

    https://developers.weixin.qq.com/community/develop/doc/00044ae90742f8c82fb78fcae56800 https://blog.c ...

随机推荐

  1. pascal矩阵 分类: 数学 2015-07-31 23:01 3人阅读 评论(0) 收藏

    帕斯卡矩阵 1.定义       帕斯卡矩阵:由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵. 杨辉三角形表是二次项 (x+y)^n 展开后的系数随自然数 n 的增大组成的一个三角形表. 如4 ...

  2. php部分---include()与require()的区别、empty()与isset is_null的区别与用法详解

    include()与require()的用途是完全一样的,不一定非得哪个放在最前面哪个放在中间.他们最根本的区别在于错误处理的方式不一样. 1.处理错误的方式: require()一个文件存在错误的话 ...

  3. c#部分---一维数组、冒泡排序、foreach的用法

    一维数组:2016-10-14 定义方式:{定义的时候,需要数据类型.长度!} 1.int []aa=new int [5];  表示数组里面有5个字符: 2.int []aa=new int []{ ...

  4. Objective-c——UI基础开发第九天(QQ好友列表)

    一.知识点: 1.双模型的嵌套使用 2.Button的对齐方式 3.优化UITableView的加载 4.layoutSubview的使用 5.cell的折叠代理 二.双模型的嵌套定义: 注意是将se ...

  5. Vue.js相关知识1

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. Javascript对象属性与方法汇总

    Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...

  7. PHP安装libevent扩展

    1. 下载扩展 官方地址http://pecl.php.net/package/libevent 请根据自己的PHP脚本选择相应版本 如 wget http://pecl.php.net/get/li ...

  8. 执行NET 命令无法使用超过20个字符的组名或用户名

    https://support.microsoft.com/en-us/kb/324639     执行 net localgroup "Performance Monitor Users& ...

  9. Daas

    联想到这些年遇到的各种客户使用桌面虚拟化的场景,深有感触.桌面虚拟化技术并不一定适合所有的用户和场景,也不仅仅只是技术方面的问题.加强安全的方法有千万种,为何此客户情守桌面虚拟化呢?某客户已经规模化实 ...

  10. centos7通过yum安装mysql,并授权远程连接

    安装: CentOS 7的yum源中没有正常安装MySQL的mysql-sever文件,需要去官网上下载(通过安装mysql的yum容器,再通过yum安装mysql) 注:安装前,需要卸载所有的mar ...