2015-12-17 53 views
2

解釋一下我的情況下,一個對象的屬性,讓我們考慮一個簡單的對象是這樣的:無法綁定到實現ICollection的<T>

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到控件的值I可以這樣做:

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從更一般的Series獲得(在這裏看到下文)實現了ICollection<int>界面我得到一個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屬性而不刪除綁定到系列內部項目的可能性?

回答

1

我想這與ICollection接口有關,也許是因爲.NET期望綁定到內部的項目。

正確。更確切地說繼承的IEnumerable<T>

如何在此場景下綁定到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); 
+0

以我提供的簡化示例爲例,所有解決方案都可以工作。如果我拿我的原始文件解決方案(A)失敗。也許還有其他一些缺陷,但現在沒時間去搜索它,只是想告訴可能感興趣的人 –