无法绑定到实现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> 接口,并且可能与.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);