您还可以使用 linq 和匿名类型以更少的代码实现相同的结果,如 here 所述。
更新:博客已关闭,这是内容:
(..) 表中显示的值表示字符串的长度,而不是字符串值 (!)
这可能看起来很奇怪,但这就是绑定机制默认的工作方式——给定一个对象,它将尝试绑定到该对象的第一个属性(它可以找到的第一个属性)。
当传递一个实例时,它绑定到的 String 类的属性是 String.Length,因为没有其他属性可以提供实际的字符串本身。
这意味着要获得正确的绑定,我们需要一个包装器对象,它将字符串的实际值作为属性公开:
public class StringWrapper
{
string stringValue;
public string StringValue { get { return stringValue; } set { stringValue = value; } }
public StringWrapper(string s)
{
StringValue = s;
}
}
List<StringWrapper> testData = new List<StringWrapper>();
// add data to the list / convert list of strings to list of string wrappers
Table1.SetDataBinding(testdata);
虽然此解决方案按预期工作,但它需要相当多的代码行(主要是将字符串列表转换为字符串包装器列表)。
我们可以通过使用 LINQ 和匿名类型来改进这个解决方案——我们将使用 LINQ 查询来创建一个新的字符串包装器列表(在我们的例子中,字符串包装器将是一个匿名类型)。
var values = from data in testData select new { Value = data };
Table1.SetDataBinding(values.ToList());
我们要做的最后一个更改是将 LINQ 代码移动到扩展方法:
public static class StringExtensions
{
public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
{
var values = from data in strings
select new { Value = data };
return values.ToList();
}
这样我们就可以通过对任何字符串集合调用单个方法来重用代码:
Table1.SetDataBinding(testData.CreateStringWrapperForBinding());