WPF学习(20)-格式化绑定的数据

     格式化绑定的数据,简单地说就是怎么样让绑定的数据更加美观灵活地显示在前台页面。

      比如前台有一个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
                
            
        

 

WPF学习(20)-格式化绑定的数据_第1张图片

       这个listbox,没有一个item里面包含一个checkbox和一个textblock,但是更多的时候,我们的需求比这个复杂很多,这个时候就需要格式化,以满足我们需求的方式来显示列表项的子项,有两种方式,样式和数据模板。

        
            
                
            
            
                
                    
                    1
                          
            
            
                
                    
                    2
                
            
            
                
                    
                    3
                
            
        

 ItemContainerStyle里面设置了样式,这样就显示的好看了一些,既然有样式,也可以加触发器了。

WPF学习(20)-格式化绑定的数据_第2张图片

    上面这个例子有个问题,就是checkbox是手动加在每个textblock上面的,如果我们要代码去遍历是否选中,这样就很麻烦,所以可以使用模板,直接把checkbox放进模板里面。


    
        
                
            
        
    
    
        
            
                
                    1
                
            
            
                
                    2
                
            
            
                
                    3
                
            
        
    

 这样每个item都带有一个checkbox了。

WPF学习(20)-格式化绑定的数据_第3张图片

交替样式,也是针对这种item control的,就是一个附加属性,直接看效果

  
            
                
            
            1
            2
            3
            4
        

 

WPF学习(20)-格式化绑定的数据_第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。

WPF学习(20)-格式化绑定的数据_第5张图片

 

你可能感兴趣的:(WPF)