C# 从IList转换为List<;T>;
我知道这个问题已经得到了回答,但我已经尝试了许多解决方案,但没有一个有效 我有一个图表,在选择一个系列后绑定到一个IList对象,但是我在从IList转换到List时遇到了问题;由于我的角色设置,列表最终为空:C# 从IList转换为List<;T>;,c#,wpf,list,C#,Wpf,List,我知道这个问题已经得到了回答,但我已经尝试了许多解决方案,但没有一个有效 我有一个图表,在选择一个系列后绑定到一个IList对象,但是我在从IList转换到List时遇到了问题;由于我的角色设置,列表最终为空: public class ChartData { public string Type { get; set; } public int Year { get; set; } public int Value { get; set; } } public IL
public class ChartData
{
public string Type { get; set; }
public int Year { get; set; }
public int Value { get; set; }
}
public IList BindSelectedItems
{
get
{
return _bindSelectedItems;
}
set
{
_bindSelectedItems = value;
//Solutions I found that don't work:
IList<ChartData> myList = value.OfType<ChartData>().ToList();
//IList<ChartData> myList = value.Cast<ChartData>().ToList();
List<ChartData> cd = myList as List<ChartData>;
foreach (var c in cd) //does not work b/c myList is empty
{
Debug.Print("type is " + c.Type + " cost is " + c.Value + " year is " + c.Year);
}
RaisePropertyChanged("BindSelectedItems");
}
}
IList _bindSelectedItems;
公共类图表数据
{
公共字符串类型{get;set;}
公共整数年{get;set;}
公共int值{get;set;}
}
公共IList BindSelectedItems
{
得到
{
返回_bindSelectedItems;
}
设置
{
_bindSelectedItems=值;
//我发现不起作用的解决方案:
IList myList=value.OfType().ToList();
//IList myList=value.Cast().ToList();
列表cd=myList作为列表;
foreach(var c in cd)//不工作b/c myList为空
{
调试.打印(“类型为“+c.类型+”成本为“+c.值+”年份为“+c.年份”);
}
RaisePropertyChanged(“BindSelectedItems”);
}
}
IList_bindSelectedItems;
问题出在绑定目标的签名范围内。您正在绑定到一个IList
,是否要为要绑定到的集合公开一个持有者/包装器?我相信您实际上想要绑定到数据,而不是它的包装器
改为绑定到IList
,以便绑定操作可以反映出作为最终目标的ChartData
对象
公共IList BindSelectedItems
{
得到
{
返回_bindSelectedItems;
}
设置
{
_bindSelectedItems=值;
RaisePropertyChanged(“BindSelectedItems”);
}
}
IList_bindSelectedItems;
我意识到我无法实现绑定到IList时所做的事情,必须按如下方式使用和观察收集:
ObservableCollection<object> _bindSelectedItems;
public ObservableCollection<object> BindSelectedItems
{
get { return _bindSelectedItems; }
set
{
_bindSelectedItems = value;
_bindSelectedItems.CollectionChanged += _bindSelectedItems_CollectionChanged;
RaisePropertyChanged("BindSelectedItems");
}
}
void _bindSelectedItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
ObservableCollection<object> items = sender as ObservableCollection<object>;
}
observedcollection\u bindSelectedItems;
公共可观测集合BindSelectedItems
{
获取{return\u bindSelectedItems;}
设置
{
_bindSelectedItems=值;
_bindSelectedItems.CollectionChanged+=\u bindSelectedItems\u CollectionChanged;
RaisePropertyChanged(“BindSelectedItems”);
}
}
void\u bindSelectedItems\u CollectionChanged(对象发送方,System.Collections.Specialized.notifycollectionchangedventargs e)
{
ObservableCollection items=发送方作为ObservableCollection;
}
在\u bindSelectedItems
中的数据类型是什么?如果你能展示一个简短但完整的程序来演示这个问题,这将非常有帮助。若使用Cast而不是type,会发生什么?为什么要将用作cd
,而不仅仅是List=value.Cast().ToList()代码>?您确定列表中有项目吗?如果列表中的某个项无法强制转换到ChartData
类,则您未注释的代码版本将引发异常。是的,“BindSelectedItems”也作为项源绑定到GridControl,我可以在单击该系列后看到返回数据的列表。更好的问题,这些数据可能来自哪里?如果它存在于另一个控件上…为什么不在Xaml中设置绑定@为什么要删除WPF
标记?用户指定了WPF,这是一个WPF问题。我试过了,结果“value”返回了一个NullReferenceException@AC您是否将属性的签名更改为IList
?@AC您能否将此问题提取到主应用程序之外的基本示例中?如果是这样的话,它可能会对这个问题有所帮助;其他事情正在发生,从我的角度看,我看不到。如果你能创建一个简单的例子,并在文章中提供,它可能会导致一个答案。
ObservableCollection<object> _bindSelectedItems;
public ObservableCollection<object> BindSelectedItems
{
get { return _bindSelectedItems; }
set
{
_bindSelectedItems = value;
_bindSelectedItems.CollectionChanged += _bindSelectedItems_CollectionChanged;
RaisePropertyChanged("BindSelectedItems");
}
}
void _bindSelectedItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
ObservableCollection<object> items = sender as ObservableCollection<object>;
}