格式化绑定的数据,简单地说就是怎么样让绑定的数据更加美观灵活地显示在前台页面。
比如前台有一个textbox,绑定了一个int值,这个int值表示钱,那么我们就有显示的时候带上钱的标识,那么就需要对数据进行格式化,下面是完整的例子,显示效果,前面多了一个dollor符。
如果有更复杂的格式化要求,不是简单的字符串格式化可以解决的,就需要使用数据转换技术,里面有一个东西叫做值转换器。 比如我们有个需求,是要实现股票价格显示,那么我们首先需要定制一个值转换器,也很简单,就是值转换之后加上最后的时间,然后再组织一下语言,每次股价变动之后,前台就更改,然后按照我们自定义的格式来显示。
[ValueConversion(typeof(double), typeof(string))]
public class SharePriceConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
double SharePrice = (double)value;
return DateTime.Now + "股价为:" + SharePrice.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
下面前台绑定还是一样的,命名空间导入,加一个绑定,绑定的转换标记引入,就可以啦。
效果如下,就转换过来啦。
接下来尝试一下应用条件格式化,比如我们绑定的一个值,值内容取值不同范围的时候,显示不同的格式化类型,我们就用背景来,一个textblock,当里面的数字小于多少的时候就标红,否则显示黄色背景,结果显示,我们文本框里面输入不同的值的时候,背景就会发生变化了。
[ValueConversion(typeof(string), typeof(Brush))]
public class Myconverter : IValueConverter
{
public int MinData { get; set; }
public Brush Default { get; set; }
public Brush Min { get; set; }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
try
{
int s = int.Parse(value.ToString());
if (s > MinData)
{
return Default;
}
return Min;
}
catch
{
return Min;
}
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
单个值转换已经搞定了,可以试一下多个值的转换了,还是一样的,简单是使用string.Format,复杂的自己用值转换器,差别就是bingding,修改为MultiBinding,值转换器继承IValueConverter改成IMultiValueConverter就可以了。
接着,是我们用的非常多的列表控件,比如listbox
1
2
3
这个listbox,没有一个item里面包含一个checkbox和一个textblock,但是更多的时候,我们的需求比这个复杂很多,这个时候就需要格式化,以满足我们需求的方式来显示列表项的子项,有两种方式,样式和数据模板。
1
2
3
ItemContainerStyle里面设置了样式,这样就显示的好看了一些,既然有样式,也可以加触发器了。
上面这个例子有个问题,就是checkbox是手动加在每个textblock上面的,如果我们要代码去遍历是否选中,这样就很麻烦,所以可以使用模板,直接把checkbox放进模板里面。
1
2
3
这样每个item都带有一个checkbox了。
交替样式,也是针对这种item control的,就是一个附加属性,直接看效果
1
2
3
4
前面的样式可以很轻松地格式化我们的数据,但是还有一个最重要的问题,就是没办法突破原始控件的局限,比如我们已经知道,一个button里面可以放上我们自由组合的元素,但是如何把我们的数据放入这个button呢?这就需要使用数据模板啦。
person p1 = new person();
p1.Name = "洪波";
p1.Age = 31;
ObservableCollection oc = new ObservableCollection();
oc.Add(p1);
person p2 = new person();
p2.Name = "薛世海";
p2.Age = 35;
oc.Add(p2);
person p3 = new person();
p3.Name = "洪西南";
p3.Age = 1;
oc.Add(p3);
LB1.ItemsSource = oc;
这样就在listbox里面的每一个item都变成了显示名字的textblock和显示年龄的slider。