Silverlight实战示例总结(兼对Object类型绑定的处理)

在前面的博文中,如果要能进行修改,都是用strValue进行绑定的,但这只说明string类型的在datagrid自动生成的列中是可以编辑的,用Object进行绑定一样也可以编辑,但需要进行一定的处理,而且用strvalue,intvalue分别绑定也不符合开发友好原则,我在示例中有Object属性,而且也进行了通知属性处理,这里我们利用一个convert来处理object类型的绑定,根据字段自带的数据类型,其实我们可以做得很通用化。下面是代码(其它代码见示例):

1)ObjectAutoConverter.cs 用于值的转换,在这里可以进行数据类型转换和格式化。不过我处理的比较简单。

/// <summary>
    /// 双向 IValueConverter,使您可以将可绑定对象的属性(可以为空 string 值)绑定到依赖属性(在该情况下应设置为 null)。
    /// </summary>
    public class ObjectAutoConverter : IValueConverter
    {
        /// <summary>
        /// 将 <c>null</c> 或空 strings 转换为 <c>null</c>。
        /// </summary>
        /// <param name="value">要转换的值。</param>
        /// <param name="targetType">预期结果 type (已忽略)。</param>
        /// <param name="parameter">可选参数(已忽略)。</param>
        /// <param name="culture">转换的区域性(已忽略)。</param>
        /// <returns>如果 <paramref name="value"/> 为 <c>null</c> 或为空,则此方法返回 <c>null</c>,否则返回 <paramref name="value"/>。</returns>
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string strValue = value as string;
            if (targetType == typeof(int))
            {
                return string.IsNullOrEmpty(strValue) ? 0 : int.Parse(value.ToString());
            }
            return string.IsNullOrEmpty(strValue) ? null : value.ToString();
        }

        /// <summary>
        /// 将 <c>null</c> 转换回 <see cref="String.Empty"/>。
        /// </summary>
        /// <param name="value">要转换的值。</param>
        /// <param name="targetType">预期结果类型(已忽略)。</param>
        /// <param name="parameter">可选参数(已忽略)。</param>
        /// <param name="culture">转换的区域性(已忽略)。</param>
        /// <returns>如果 <paramref name="value"/> 为 <c>null</c>,则它返回 <see cref="String.Empty"/>,否则返回 <paramref name="value"/>。</returns>
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType == typeof(string))
            {
                return value ?? string.Empty;
            }
            return value.ToString();
        }
    }

2)页面绑定部分示例

<UserControl.Resources>
           <local:ObjectAutoConverter x:Key="objectAutoConverter"/>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
       
        <sdk:DataGrid x:Name="CustomGrid" ItemsSource="{Binding Path=DataTable.Rows}" Grid.Row="0" AutoGenerateColumns="False" >
            <sdk:DataGrid.Columns>
                <sdk:DataGridTextColumn CanUserReorder="True" Binding="{Binding Path=[EmployeeID].Value,Mode=TwoWay}" CanUserResize="True" CanUserSort="True" Width="Auto" />
                <sdk:DataGridTextColumn CanUserReorder="True" Binding="{Binding Path=[EmployeeName].StrValue,Mode=TwoWay}" CanUserResize="True" CanUserSort="True" Width="Auto" />
                <sdk:DataGridTextColumn CanUserReorder="True" Binding="{Binding Path=[EmployeeDesc].Value,Mode=TwoWay,Converter={StaticResource objectAutoConverter}}" IsReadOnly="false" CanUserResize="True" CanUserSort="True" Width="Auto" />
                <sdk:DataGridTextColumn CanUserReorder="True" Binding="{Binding Path=[EmployeeAge].Value,Mode=TwoWay}" CanUserResize="True" CanUserSort="True" Width="Auto" />
            </sdk:DataGrid.Columns>
        </sdk:DataGrid>
        <Button Content="查询" Command="{Binding Path=Commands[Button1Command]}" CommandParameter="{Binding ElementName=CustomGrid,Path=SelectedItem}"  Grid.Row="1" Height="23" HorizontalAlignment="Left"  Margin="157,14,0,0" Name="修改" VerticalAlignment="Center" Width="143"/>
      </Grid>

注意黑体字部分。

总结:

到这里为止,这个示例就全部完成了,虽然看起来使用价值不大(对于动态查询,复杂查询还是有相当大的好处),但如果稍稍进行改装,特别是结合实体框架博文中的更新,修改,删除自动处理(对单表)就非常有实用价值了,绝对比dotnet的Dataset结合Command来得简单而实用。有如下好处:
A)可以减少实体层,数据访问层,逻辑层,ria服务层以及客户端得模型层;
B)中间只需要一个Domainservice,而且该服务还很简单.\
但不好的地方是这种开发测试比较困难,不便于查找错误等。

这个示例基本涵盖了silverlight开发从底层到UI的各个方面(底层架构,服务处理,客户端模型,VM,V,一般绑定,索引器绑定,数据转换等),对于初学者来说还是非常实用的。如果真正的按示例自己做一篇绝对收获颇多。有一定基础后,可以看一下我写的关于依赖属性,附加属性,Triggers,Behaviors方面的文章,对于深入了解silverlight,wpf有一定的好处。对于UI开发中的自定义控件,动画,窗口拖动等,我也在研究中,现在正在做一个MDI,ModeWindow的模拟。对于桌面级开发,微软目前提供的还有些距离。(不过现在的自定义控件还是很简单的,微软把这个问题简化了非常多)

希望这个实例对大家有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值