`
wodamazi
  • 浏览: 1419895 次
文章分类
社区版块
存档分类
最新评论

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的模拟。对于桌面级开发,微软目前提供的还有些距离。(不过现在的自定义控件还是很简单的,微软把这个问题简化了非常多)

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics