您可以將DataGrid
的ItemsSource
屬性綁定到任何公共財產是返回IEnumerable
,inclucing的IList<T>
財產。你不能綁定到字段,但這樣你應該做Items
的屬性,如果你打算綁定到它:
public IList<SomeType> Items { get; private set; }
但你能夠項目在運行時動態添加到源集合,並有新項目自動顯示在DataGrid中,源集合必須實現INotifyCollectionChanged
接口。只有ObservableCollection<T>
類在.NET Framework中執行此操作。 A List<T>
沒有。
而IList<T>
不是隻讀集合,因爲它有一個Add方法:https://msdn.microsoft.com/en-us/library/system.collections.ilist.add%28v=vs.110%29.aspx。所以我想你不妨使用ObservableCollection<T>
。
編輯:
如果你真的想refesh的DataGrid
「手動」,你可以訂閱ItemAdded
事件視圖的代碼隱藏您的對象,並使用BindingExpression
的UpdateTarget()
方法:
someObject.ItemAdded += (se, ee) =>
{
var be = BindingOperations.GetBindingExpression(theDataGrid, DataGrid.ItemsSourceProperty);
if (be != null)
be.UpdateTarget();
};
或者您也可以重置屬性ItemsSource
:
someObject.ItemAdded += (se, ee) =>
{
theDataGrid.ItemsSource = someObject.Items;
};
編輯2:
我的問題是,我需要一個可靠的方式來攔截網的站綁定機制,使我可以調用的AddItem()時添加一個新行,例如。我已經用IBindingList進行了試驗,看看我能否使用它,但是至今還沒有完成。
如果您在DataGrid
的ItemsSource
屬性綁定到一個ObservableCollection<SomeType>
,你可以處理CollectionChanged
情況下,本集合:
observableCollection.CollectionChanged += (ss, ee) =>
{
if(ee.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
SomeType newItem = ee.NewItems[0] as SomeType;
someObject.AddItem(newItem);
}
};
當DataGrid
增加了一個新的項目到該事件將引發源集合。
來源
2017-02-16 23:01:17
mm8
感謝我更新根據您的反饋我的榜樣。關鍵是我無法對Items進行更改,但我仍然希望使用DataGrid功能來編輯現有項目和創建新項目。但是當你使用內置的綁定時,這些似乎只能起作用。 – Dan
您「無法更改」Items集合,但您希望能夠創建新項目並將它們添加到項目中?這沒有意義。如果您希望能夠編輯集合中的項目,則應設置DataGrid的ItemsSource屬性或將其綁定到此集合。如果您不想將項目添加到Items集合,則創建另一個集合以進行綁定。 – mm8
上面的示例類是我必須編碼的現有API的簡化。該對象包含一個您可以閱讀的集合,但對其進行修改需要調用一個方法,例如AddItem()。 – Dan