[原创]WPF资源Binding自定义集合类。

简单介绍一下Wpf资源字典:

每个WPF界面元素都有一个名为Resource的属性,这个属性继承至FrameworkElement类,其类型为ResourceDictionary。ResourceDictionary能够以键值对的形式存储资源,当要使用到某个资源的时候,使用键值对的形式获取资源对象。在保存资源时,ResourceDictionary视资源对象为Object类型,所以再使用资源时先要对资源对象进行类型转换,XAML编译器能够根据Attribute自动识别资源类型,如果类型不对就会抛出异常。

如果资源字典中存储的是集合类型,而应用时只想取其中一个元素来绑定,这样就需要自己编写转换器,来返回需要的元素值。

下面演示绑定集合中某元素例子:

首先定义集合内容:

 1 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 2                     xmlns:sys="clr-namespace:System;assembly=mscorlib"
 3                     xmlns:syscollection="clr-namespace:System.Collections;assembly=mscorlib"
 4                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 5 <!--登录界面-->
 6     <syscollection:ArrayList x:Key="page_login">
 7         <syscollection:DictionaryEntry Key="title" Value="系统"/>
 8         <syscollection:DictionaryEntry Key="login" Value="登录"/>
 9         <!--提示-->
10         <syscollection:DictionaryEntry Key="user_isnull" Value="用户不能为空"/>
11         <syscollection:DictionaryEntry Key="password_isnull" Value="密码不能为空"/>
12         <syscollection:DictionaryEntry Key="user_noexist" Value="用户不存在"/>
13         <syscollection:DictionaryEntry Key="password_error" Value="密码错误"/>
14     </syscollection:ArrayList>
15
16 </ResourceDictionary>

其次定义转换器:

 1 class CultureConverter : IValueConverter
 2     {
 3         public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 4         {
 5             if (value == null) return null;
 6             ArrayList lst = value as ArrayList;
 7             if (lst == null) return null;
 8             Dictionary<object, object> dic = lst.Cast<DictionaryEntry>().ToDictionary(item => item.Key, item => item.Value);
 9             if (dic.ContainsKey(parameter))
10                 return dic[parameter];
11             else
12                 return null;
13         }
14
15         public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
16         {
17             throw new NotImplementedException();
18         }
19     }

最后在Xaml中引用资源:

1     <!--定义转换器资源-->
2     <Window.Resources>
3         <local:CultureConverter x:Key="CultureConverter"/>
4     </Window.Resources>
5   <!--在Xaml中引用资源-->
6 <Label  Content="{Binding Converter={StaticResource CultureConverter}, ConverterParameter=title,Source={StaticResource page_login}}"  Grid.Row="1"  VerticalAlignment="Top" FontSize="36" FontWeight="Bold" Padding="0" Grid.ColumnSpan="2" HorizontalContentAlignment="Center" />

注意:在Converter和Source中不可以引用DynamicResource。

应用资源转换器可以灵活的实现资源的引用,尤其是分组资源。一个非常好的案例:国际化的应用。

时间: 2024-10-10 07:17:02

[原创]WPF资源Binding自定义集合类。的相关文章

【转载一篇WPF之Binding】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之Binding对数据的转换(第五天)

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

WPF之Binding深入探讨

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

【原创】android——Tabhost 自定义tab+底部实现+intent切换内容

1,实现tabhost自定义格式,再此仅仅显示背景和文字,效果图预览:(底边栏所示) (图片变形) 2,xml配置 activity_user的XML配置  1 <TabHost xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:id="@+id/tabhost&qu

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资源文件

作为一个扩展,你需要了解DotNetZip用法,请参见:C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件 你也需要了解单文件内嵌入资源文件基本方法,参见:WPF调用嵌入的非.net的EXE资源文件 作者:一剑 如果你有一大堆文件或者想通过打包的方式嵌入任意格式的文件到资源文件中,那么你可以打包成一个ZIP文件,再嵌入到资源文件中是一个不错的选择: using System.Reflection;//++ using System.IO; using Ionic.Zip; na

编写高质量代码改善C#程序的157个建议——建议23:避免将List&lt;T&gt;作为自定义集合类的基类

建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口.FCL结合类应该以组合的形式包含至自定义的集合类,需要扩展的泛型接口通常是IEnumerable<T>和ICollection<T>(或ICollection<T>的子接口,如IList<T>),前者规范了集合类的迭代功能,后者规范了一个集合通常会有的操作. 一般的情况下,下面两个实现的集合类都能完成默认的

WPF快速入门系列(6)——WPF资源和样式

一.引言 WPF资源系统可以用来保存一些公有对象和样式,从而实现重用这些对象和样式的作用.而WPF样式是重用元素的格式的重要手段,可以理解样式就如CSS一样,尽管我们可以在每个控件中定义格式,但是如果多个控件都应用了多个格式的时候,我们就可以把这些格式封装成格式,然后在资源中定义这个格式,之前如果用到这个格式就可以直接使用这个样式,从而达到重用格式的手段.从中可以发现,WPF资源和WPF样式是相关的,我们经常把样式定义在资源中. 二.WPF资源详解 2.1 资源基础介绍 尽管可以在代码中创建和操