zoukankan      html  css  js  c++  java
  • 稳扎稳打Silverlight(50) 4.0绑定之DependencyObject绑定, 索引器绑定, StringFormat, TargetNullValue和FallbackValue, CollectionViewSource

    [索引页]
    [源码下载]


    稳扎稳打Silverlight(50) - 4.0绑定之DependencyObject绑定, 索引器绑定, StringFormat, TargetNullValue和FallbackValue, CollectionViewSource



    作者:webabcd


    介绍
    Silverlight 4.0 绑定相关的增强:

    • DependencyObject Binding - 新增了对 DependencyObject 绑定的支持 
    • Indexer Binding - 新增了对索引器绑定的支持 
    • StringFormat - 指定绑定数据的显示格式 
    • TargetNullValue - 当绑定数据为 null 时所需要显示的值 
    • FallbackValue - 当绑定失败(无法返回值)的时候所需要显示的值 
    • CollectionViewSource - 实现了 ICollectionView 的类,可以通过它对数据排序、筛选和分组 



    在线DEMO
    http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html


    示例
    1、演示如何绑定到 DependencyObject
    DependencyObjectBinding.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Binding.DependencyObjectBinding" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="DependencyObjectBinding Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left">

                
    <!-- 
                    Silverlight 3.0 支持绑定到 FrameworkElement 
                        TextBox 继承自 FrameworkElement
                
    -->
                
    <TextBox Text="{Binding ElementName=slider, Path=Value}" />

                
    <!-- 
                    Silverlight 4.0 中新增了对 DependencyObject 绑定的支持
                        RotateTransform 继承自 DependencyObject
                
    -->
                
    <Rectangle Width="100" Height="100" RenderTransformOrigin="0.5, 0.5" Fill="Red">
                    
    <Rectangle.RenderTransform>
                        
    <RotateTransform Angle="{Binding ElementName=slider, Path=Value}" />
                    
    </Rectangle.RenderTransform>
                
    </Rectangle >

                
    <Slider Name="slider" Height="20" Minimum="0" Maximum="360" />

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>



    2、演示如何绑定到索引器
    IndexerBinding.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Binding.IndexerBinding" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="IndexerBinding Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--
                用于演示索引器的绑定
            
    -->
            
    <TextBlock Name="textBlock" Text="{Binding Path=[3] }" />

        
    </Grid>
    </navigation:Page>


    IndexerBinding.xaml.cs

    代码
    /*
     * Silverlight 4.0 中新增了对索引器绑定的支持,索引的类型必须实现 IList
     
    */

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight40.Binding
    {
        
    public partial class IndexerBinding : Page
        {
            
    public IndexerBinding()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                List
    <string> list = new List<string>();
                
    for (int i = 0; i < 10; i++)
                {
                    list.Add(
    "索引:" + i.ToString());
                }

                textBlock.DataContext 
    = list;
            }
        }
    }



    3、演示在绑定时使用 StringFormat 来指定数据的显示格式
    StringFormat.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Binding.StringFormat" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="StringFormat Page">
        
    <Grid x:Name="LayoutRoot">

            
    <!--
                StringFormat - 指定绑定数据的显示格式
            
    -->
            
    <TextBlock Name="textBlock" Text="{Binding StringFormat='yyyy-MM-dd HH:mm:ss'}" />
            
        
    </Grid>
    </navigation:Page>


    StringFormat.xaml.cs

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight40.Binding
    {
        
    public partial class StringFormat : Page
        {
            
    public StringFormat()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                textBlock.DataContext 
    = DateTime.Now;
            }
        }
    }



    4、演示 TargetNullValue 和 FallbackValue 的效果
    TargetNullValueFallbackValue.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Binding.TargetNullValueFallbackValue" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               Title
    ="TargetNullValueFallbackValue Page">
        
    <Grid x:Name="LayoutRoot">
            
    <StackPanel HorizontalAlignment="Left" Name="stackPanel">

                
    <!--
                    FallbackValue - 当绑定失败(无法返回值)的时候所需要显示的值
                
    -->
                
    <TextBlock Text="{Binding Path=xxx, FallbackValue='绑定失败时的默认值'}" />

                
    <!--
                    TargetNullValue - 当绑定数据为 null 时所需要显示的值
                
    -->
                
    <TextBlock Text="{Binding TargetNullValue='绑定返回值为 null'}" />

            
    </StackPanel>
        
    </Grid>
    </navigation:Page>


    TargetNullValueFallbackValue.xaml.cs

    代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;
    using System.Windows.Navigation;

    namespace Silverlight40.Binding
    {
        
    public partial class TargetNullValueFallbackValue : Page
        {
            
    public TargetNullValueFallbackValue()
            {
                InitializeComponent();
            }

            
    protected override void OnNavigatedTo(NavigationEventArgs e)
            {
                stackPanel.DataContext 
    = null;
            }
        }
    }



    5、演示 CollectionViewSource 的应用
    Product.cs

    代码
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    namespace Silverlight40.Binding
    {
        
    // 实体类
        public class Product
        {
            
    public int ProductId { getset; }
            
    public string Name { getset; }
            
    public string Category { getset; }
        }
    }


    ProductCollection.cs

    代码
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    using System.Collections.Generic;

    namespace Silverlight40.Binding
    {
        
    public class ProductCollection : List<Product>
        {
            
        }
    }


    CollectionViewSource.xaml

    代码
    <navigation:Page x:Class="Silverlight40.Binding.CollectionViewSource" 
               xmlns
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
               xmlns:x
    ="http://schemas.microsoft.com/winfx/2006/xaml" 
               xmlns:d
    ="http://schemas.microsoft.com/expression/blend/2008"
               xmlns:mc
    ="http://schemas.openxmlformats.org/markup-compatibility/2006"
               xmlns:navigation
    ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
               xmlns:sdk
    ="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
               xmlns:c
    ="clr-namespace:System.ComponentModel;assembly=System.Windows"
               xmlns:local
    ="clr-namespace:Silverlight40.Binding"
               Title
    ="CollectionViewSource Page">
        
    <Grid x:Name="LayoutRoot">

            
    <Grid.Resources>
                
    <local:ProductCollection x:Key="products">
                    
    <local:Product ProductId="1" Name="abc" Category="CategoryA" />
                    
    <local:Product ProductId="2" Name="xyz" Category="CategoryA" />
                    
    <local:Product ProductId="3" Name="webabcd" Category="CategoryB" />
                
    </local:ProductCollection>

                
    <!--
                    CollectionViewSource - 实现了 ICollectionView 的类,可以通过它对数据排序、筛选和分组
                        CollectionViewSource.SortDescriptions - 指定排序方式
                            PropertyName - 指定排序的字段
                            Direction - 指定按升序还是降序排序
                        CollectionViewSource.GroupDescriptions - 指定分组方式
                            PropertyName - 指定分组的字段
                            StringComparison - 指定是否区分大小写等
                
    -->
                
    <CollectionViewSource x:Name="dataSource" Source="{StaticResource products}">
                    
    <CollectionViewSource.SortDescriptions>
                        
    <c:SortDescription PropertyName="Name" Direction="Descending" />
                    
    </CollectionViewSource.SortDescriptions>
                    
    <CollectionViewSource.GroupDescriptions>
                        
    <PropertyGroupDescription PropertyName="Category" StringComparison="CurrentCultureIgnoreCase" />
                    
    </CollectionViewSource.GroupDescriptions>
                
    </CollectionViewSource>
            
    </Grid.Resources>

            
    <sdk:DataGrid ItemsSource="{Binding Source={StaticResource dataSource}}" />

        
    </Grid>
    </navigation:Page>



    OK
    [源码下载]

  • 相关阅读:
    前端生成pdf文件之pdfmake.js
    vim 安装
    linux基础学习
    python 编码处理
    Ubuntu 下配置 SSH服务全过程及问题解决
    yum 安装
    Ubuntu安装MySQL
    Linux各发行版本及其软件包管理方法
    轻松学习LINUX系列教程推出
    常用命令
  • 原文地址:https://www.cnblogs.com/webabcd/p/1818757.html
Copyright © 2011-2022 走看看