C# 从IList转换为List<;T>;

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

我知道这个问题已经得到了回答,但我已经尝试了许多解决方案,但没有一个有效

我有一个图表,在选择一个系列后绑定到一个IList对象,但是我在从IList转换到List时遇到了问题;由于我的角色设置,列表最终为空:

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>;

    }