silverlight:telerik RadControls中RadGridView的一个Bug及解决办法
当RadGridView中嵌套RadComboBox,且RadGridView的高度不够出现滚动条时,上下拉动滚动条后,RadComboBox中的选中值将丢失!
如下图:
滚动条未拖动前
滚动条上下拖动后(注意下图的高亮部分)
重现该Bug的测试代码:
Model层
TextValueObject.cs
namespace RadControlsBug.Model
{
public class TextValueObject
{
public string Text { set; get; }
public string Value { set; get; }
}
}
SexType.cs
namespace RadControlsBug.Model
{
public class SexType
{
/// <summary>
/// 男
/// </summary>
public static string Male = "男";
/// <summary>
/// 女
/// </summary>
public static string FeMale = "女";
}
}
SexTypeCollection.cs
using System.Collections.Generic;
namespace RadControlsBug.Model
{
public static class SexTypeCollection
{
private static List<TextValueObject> _items = new List<TextValueObject>();
public static List<TextValueObject> Items
{
get { return _items; }
set { _items = value; }
}
static SexTypeCollection()
{
_items.Add(new TextValueObject() { Text = "男", Value = SexType.Male });
_items.Add(new TextValueObject() { Text = "女", Value = SexType.FeMale });
}
}
}
Person.cs
using System.Collections.Generic;
namespace RadControlsBug.Model
{
public class Person
{
public string Name { set; get; }
public string Sex { set; get; }
private List<TextValueObject> _sexItems = SexTypeCollection.Items;
public List<TextValueObject> SexItems { get { return _sexItems; } }
}
}
Company.cs
using System.Collections.ObjectModel;
namespace RadControlsBug.Model
{
public class Company
{
private ObservableCollection<Person> _employees = new ObservableCollection<Person>();
public ObservableCollection<Person> Employees
{
get { return _employees; }
set { _employees = value; }
}
public Company()
{
this._employees.Add(new Person() { Name = "张三", Sex = SexType.Male });
this._employees.Add(new Person() { Name = "李四", Sex = SexType.FeMale });
this._employees.Add(new Person() { Name = "王五", Sex = SexType.Male });
this._employees.Add(new Person() { Name = "赵六", Sex = SexType.FeMale });
this._employees.Add(new Person() { Name = "孙七", Sex = SexType.Male });
this._employees.Add(new Person() { Name = "杨九", Sex = SexType.FeMale });
this._employees.Add(new Person() { Name = "胡十", Sex = SexType.Male });
}
}
}
UI层:
MainPage.Xaml:
<UserControl x:Class="RadControlsBug.MainPage"
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:telerik="http://schemas.telerik.com/2008/xaml/presentation"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<telerik:RadGridView ShowGroupPanel="False" RowIndicatorVisibility="Collapsed" CanUserFreezeColumns="False" AutoGenerateColumns="False" ItemsSource="{Binding Employees,Mode=TwoWay}" Width="300" Height="120" Name="gridView1">
<telerik:RadGridView.Columns>
<telerik:GridViewColumn Header="姓名" Width="80" >
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<telerik:RadMaskedTextBox Value="{Binding Name,Mode=TwoWay}" MaskType="None"></telerik:RadMaskedTextBox>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
<telerik:GridViewColumn Header="性别" Width="80" >
<telerik:GridViewColumn.CellTemplate>
<DataTemplate>
<telerik:RadComboBox ItemsSource="{Binding SexItems,Mode=TwoWay}" SelectedValue="{Binding Sex,Mode=TwoWay}" SelectedValuePath="Value" DisplayMemberPath="Text"/>
</DataTemplate>
</telerik:GridViewColumn.CellTemplate>
</telerik:GridViewColumn>
</telerik:RadGridView.Columns>
</telerik:RadGridView>
</StackPanel>
</Grid>
</UserControl>
MainPage.Xaml.cs:
using System.Windows;
using System.Windows.Controls;
using RadControlsBug.Model;
namespace RadControlsBug
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
}
void Page_Loaded(object sender, RoutedEventArgs e)
{
Company _viewModel = new Company();
this.DataContext = _viewModel;
}
}
}
该问题曾经困扰我长达2周之久,在Telerik的论坛上提问也未得到回复。
曾经反复尝试,发现解决方法居然极其简单:
<telerik:RadComboBox ItemsSource="{Binding SexItems,Mode=TwoWay}"
SelectedValue="{Binding Sex,Mode=TwoWay}" SelectedValuePath="Value" DisplayMemberPath="Text"/>
改成:
<telerik:RadComboBox SelectedValue="{Binding Sex,Mode=TwoWay}" SelectedValuePath="Value"
DisplayMemberPath="Text" ItemsSource="{Binding SexItems,Mode=TwoWay}"/>
后,问题奇迹般的解决了!
分享于此,希望有助于遇到同样问题的朋友。(个人分析:有可能telerik的开发人员在解析XAML时,判断逻辑依赖于属性出现的顺序导致--胡猜的,我也没去看它的源码)
最后谈一下我个人对于Telerik RadControls For Silverlight这套控件的感受,用这套控件做项目开发已经有近3个月的时间,总体感觉还不错,能大幅提高团队的开发效率,官方有详细文档和示例,上手非常容易,而且客观来讲,BUG也比较少(用了3个月,基本上才发现这一个比较诡异的BUG),此外,如果是正版用户,官方还提供源码,并有一年的免费升级期限,每季度官方均会对整套控件做一次升级(主要是修复之前的BUG,以及增加一些新功能)。 从成本上考虑,一套控件的售价9k RMB左右(无Licence数量限制,而且能拿到源码任意修改),国内用户可在慧都控件网上直接购买,对于公司来讲这个成本其实并不高(相比公司招人自己实现这些控件的功能而言,9k多其实可以忽略不计了),如果您的公司打算致力于企业级应用的RIA开发,建议使用。
- CentOS安装Redis、PHPredis扩展
- 日志分析实战之清洗日志小实例4:统计网站相关信息
- PHP-数组排序
- hdu---(3555)Bomb(数位dp(入门))
- PHP-循环
- 日志分析实战之清洗日志小实例3:如何在spark shell中导入自定义包
- PHP-函数
- hdu----(5045)Contest(数位dp)
- hdu----(5053)the Sum of Cube(签到题,水体)
- RHEL构建DNS服务器-多区域
- hdu----(5050)Divided Land(二进制求最大公约数)
- 日志分析实战之清洗日志小实例1:使用spark&Scala分析Apache日志
- RHEL构建DNS服务器-单区域
- hdu----(5047)Sawtooth(大数相乘+数学推导)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)
- 手撸实现UDP和TCP通信