无法绑定到实现ICollection<;T>;

本文关键字:lt gt ICollection 绑定 实现 | 更新日期: 2023-09-27 18:27:12

为了解释我的情况,让我们考虑一个简单的对象,如下所示:

public class FixedSeries : Series
{
    int val1, val2;
    public FixedSeries(int val1, int val2) { this.val1 = val1; this.val2 = val2; }
    public int Diff
    {
        get { return val2 - val1; }
        set { val2 = val1 + value; }
    }
}

然后,如果在我的表单中,我想将Diff绑定到控件的值,我可以这样做:

BindingSource source;
FixedSeries fixedSeries;
public Form1()
{
    InitializeComponent();
    fixedSeries = new FixedSeries(2, 5);    
    source = new BindingSource();
    source.DataSource = fixedSeries;
    numericUpDown1.DataBindings.Add(new System.Windows.Forms.Binding("Value", source, "Diff", false, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
}

但是,如果我的FixedSeries派生自实现ICollection<int>接口的更通用的Series(请参见下文),我将得到一个ArgumentException"无法绑定到DataSource上的属性或列Diff"。

public class FixedSeries : Series
{
    public FixedSeries(int val1, int val2)
    {
        base.Add(val1);
        base.Add(val2);
    }
    public int Diff
    {
        get { return base[1] - base[0]; }
        set { base[1] = base[0] + value; }
    }
}
public interface ISeries : ICollection<int>
{
    int this[int index] { get; }
}
public class Series : ISeries
{
    List<int> vals = new List<int>();
    public int this[int index] 
    { 
        get { return vals[index]; } 
        internal set { vals[index] = value; } 
    }
    public void Add(int item) { vals.Add(item); }
    public void Clear() { vals.Clear(); }
    public bool Contains(int item) { return vals.Contains(item); }
    public void CopyTo(int[] array, int arrayIndex) { vals.CopyTo(array, arrayIndex); }
    public int Count { get { return vals.Count; } }
    public bool IsReadOnly { get { return false; } }
    public bool Remove(int item) { return vals.Remove(item); }
    public IEnumerator<int> GetEnumerator() { return vals.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return vals.GetEnumerator(); }
}

我想这与ICollection<T>接口有关,也可能与.NET希望绑定到里面的项有关。在这种情况下,我如何绑定到Diff属性而不消除绑定到系列中项目的可能性?

无法绑定到实现ICollection<;T>;

我想这与ICollection<T> 接口,并且可能与.NET期望绑定到内部项的事实有关。

正确。更确切地说是CCD_ 10继承的CCD_。

在这种情况下,我如何绑定到Diff属性,而不消除绑定到系列中项目的可能性?

以下是的一些选项

(A) 不使用BindingSource,直接绑定到数据源对象

numericUpDown1.DataBindings.Add("Value", fixedSeries, "Diff", false, DataSourceUpdateMode.OnPropertyChanged);

(B) 将数据源对象包装成单个项目数组/列表,并将其用作BindingSource.DataSource

source.DataSource = new[] { fixedSeries };

(C) 类似于(B),但使用BindingSource.Add方法(完全不提供DataSource属性)

source.Add(fixedSeries);