我正在将 Silverlight 应用程序转换为 WPF。下面的代码没有编译,但它在 Silverlight 中编译:
XAML:
<Grid x:Name="Table">
</Grid>
Run Code Online (Sandbox Code Playgroud)
后面的代码:
foreach (var uiElement in Table.Children
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
在Where
它说
“UIElementCollection”不包含“Where”的定义,并且找不到接受“UIElementCollection”类型的第一个参数的扩展方法“Where”(您是否缺少 using 指令或程序集引用?)
System.Linq
添加了命名空间。
如果我转换UIElementCollection
为 anIList<object>
那么它可以工作,但我收到警告:
这是一个可疑的演员
我究竟做错了什么?
在 Silverlight 中,UIElementCollection
实现了IEnumerable<T>
,但UIElementCollection
在 WPF 中实现了IEnumerable
,而不是IEnumerable<T>
。如果你想在这里使用 LINQ,你可以OfType<UIElement>()
作为一个选项使用:
foreach (var uiElement in Table.Children.OfType<UIElement>()
.Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
问题是UIElementCollection
没有实现泛型IEnumerable<T>
:
public class UIElementCollection : IList, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)
虽然Enumerable.Where
扩展方法需要通用版本:
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> source,
Func<TSource,?int,?bool> predicate
)
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是首先投射元素:
foreach (var uiElement in Table.Children.OfType<UIElement>().Where(x => Grid.GetColumn((Border)x) == Table.ColumnDefinitions.Count() - 1))
{
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2018 次 |
最近记录: |