WPF快速指导4:数据绑定之绑定方向与自定义转换器

简介:

WPF快速指导4:数据绑定之绑定方向与自定义转换器
    本文摘要:
    1:绑定目标与绑定源之间的方向;
    2:自定义转换器; 

1:绑定目标与绑定源之间的方向
    该部分的定义MSDN已经描述的非常清楚了,如下:
    您可能希望应用程序使用户可以更改数据并将数据传播回源对象。或者,您可能不希望允许用户更新源数据。您可以通过设置 Binding 对象的 Mode 属性来对此进行控制。下图演示不同类型的数据流: 

image


OneWay
 绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。此绑定类型适用于绑定的控件为隐式只读控件的情况。例如,您可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免TwoWay 绑定模式的系统开销。
TwoWay 绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。此绑定类型适用于可编辑窗体或其他完全交互式 UI 方案。大多数属性都默认为 OneWay 绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如 TextBox 的 Text 属性和 CheckBox 的 IsChecked 属性)默认为 TwoWay 绑定。确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。
OneWayToSource 与 OneWay 绑定相反;它在目标属性更改时更新源属性。一个示例方案是您只需要从 UI 重新计算源值的情况。
OneTime 绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。这意味着,如果数据上下文发生了更改,或者数据上下文中的对象发生了更改,则更改会反映在目标属性中。如果您使用的数据的当前状态的快照适于使用,或者这些数据是真正静态的,则适合使用此绑定类型。如果要使用源属性中的某个值初始化目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。此绑定类型实质上是 OneWay 绑定的简化形式,在源值不更改的情况下可以提供更好的性能。


2:自定义转换器
    在数据绑定这一章中,我们提到了数据模板的绑定,比如,将Student的姓名绑定到UI的TextBlock上。假设Student的性别是一个bool值,那我们该如何处理。一种方法是使用属性触发器,但这绝不是一种好方法,因为这样一来,就会将业务逻辑放到UI层。一种更好的做法是使用自定义转换器,当bool值为true的时候,在UI上就显示“男”,否则,就显示“女”。来看本例:
    首先,我们创建DateConverter类:
    代码片段1:

    [ValueConversion(typeof(bool), typeof(string))]
    public class DateConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool re = (bool)value;
            if (re)
            {
                return "";
            }
            else
            {
                return "";
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string strValue = value as string;
            if (strValue == "")
            {
                return true;
            }
            if (strValue == "")
            {
                return false;
            }
            return DependencyProperty.UnsetValue;
        }
    }

其次,在前台,我们需要在资源中引用这个类:
代码片段2:

<Window.Resources>
<local:DateConverter x:Key="dateConverter"/>
</Window.Resources>
<StackPanel>
<TextBlock x:Name="tb" DataContext="{Binding}" Text="{Binding Path=Sex, Converter={StaticResource dateConverter}}" />
</StackPanel>

    经过自定义的转换器,我们很好了解决了需求。需要注意的是,在代码片段1中,[ValueConversion(typeof(bool), typeof(string))],第一个类型是源类型,第二个类型是目标类型。
    为了更好的理解本例,将MSDN的相关注解COPY如下:
    如果要将值转换器与绑定关联,请创建一个实现 IValueConverter 接口的类,然后实现 Convert 和 ConvertBack 方法。 转换器可以将数据从一种类型更改为另一种类型,根据区域性信息转换数据,或修改表示形式的其他方面。 有关某些典型的转换器方案示例,请参见数据绑定概述中的“数据转换”。 
    值转换器是分区域性的。 Convert 和 ConvertBack 方法都具有指示区域性信息的 culture 参数。 如果区域性信息与转换无关,那么在自定义转换器中可以忽略该参数。 
    Convert 和 ConvertBack 方法还具有名为 parameter 的参数,以便您能将转换器的同一个实例与不同参数一起使用。 例如,您可以编写格式设置转换器,以根据所用的输入参数生成不同的数据格式。 可以使用 Binding 类的 ConverterParameter,将参数作为变量传递给 Convert 和 ConvertBack 方法。

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/01/24/1943485.html,如需转载请自行联系原作者

相关文章
WPF—多重绑定和跨层级绑定
WPF—多重绑定和跨层级绑定
|
C# 数据格式 XML
WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树) 一、WPF对象级(Window对象)资源的定义与查找 实例一: StaticR...
8046 0
|
9月前
|
C# 数据库
WPF中DataGrid控件绑定数据源
WPF中DataGrid控件绑定数据源
117 0
|
C#
WPF更新绑定字段
WPF更新绑定字段
73 0
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
WPF界面无法正常显示(资源引用,如转换器),但程序正常运行
|
前端开发 C#
WPF 之 数据与命令绑定 (MVVM方式)
WPF 之 数据与命令绑定 (MVVM方式)
160 0
WPF 之 数据与命令绑定 (MVVM方式)
|
C# 前端开发
wpf中的datagrid绑定操作按钮是否显示或者隐藏
如图,需要在wpf中的datagrid的操作那列有个确认按钮,然后在某些条件下确认按钮可见,某些情况下不可见的,放在mvc里直接在cshtml页面中if..else就行了。 但是在wpf里不行。。网上搜索了好久才找到解决方法,原来只是binding那个visiable属性就行了,
6847 0
|
C#
WPF中一个控件绑定另一个控件的属性
原文:WPF中一个控件绑定另一个控件的属性 如同一个Grid中的一个按钮根据另一个按钮的显示与否作出不同的响应: 绑定的时候通过ElementName来指定控件               ...
1801 0
|
C# Windows
WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配
原文:WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配 WPF Toolkit AutoCompleteBox 实体类绑定 关键字自定义关联搜索匹配 网上的例子都是零散的   翻阅了 很多篇文章后 再根据 自己项目的实际需求  整理出一个完整的 应用例子...
1060 0
|
C#
WPF使用HierarchicalDataTemplate绑定Dictionary生成TreeView
原文:WPF使用HierarchicalDataTemplate绑定Dictionary生成TreeViewDictionary中的CustomeType是一个集合,将其绑定生成一棵树,树的第一层节点是Dictionary的Key,第二层是CustomeType集合,所有代码用XAML实现。
1411 0