![](/img/trans.png)
[英]Databinding ObservableCollection<T> to Datagrid not working
[英]WPF DataBinding ObservableCollection<T> to DataGrid
我正在嘗試在單獨的UserControl中創建DataGrid,其DataContext是T的List。
在后面的代碼中,我創建一個List,填充列表,然后將其發送到UserControl的構造函數,在該構造函數中我有我正在嘗試填充的DataGrid。
UserControl類如下。
public partial class QuotePreview : UserControl
{
private static SelectionList previewList = new SelectionList();
public SelectionList PreviewList
{
get { return previewList; }
}
public QuotePreview()
{
InitializeComponent();
}
public QuotePreview(SelectionList selectedOptions)
{
InitializeComponent();
previewList = selectedOptions;
QuotePreviewDataGrid.DataContext = previewList;
}
}
而Xaml看起來像:
<DataGrid Name="QuotePreviewDataGrid"
AutoGenerateColumns="False"
ItemsSource="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Model Number" Binding="{Binding ModelNumber}"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
<DataGridTextColumn Header="List Price per Unit" Binding="{Binding Price}"/>
</DataGrid.Columns>
</DataGrid>
我也試過設置ItemSource
QuotePreviewDataGrid.ItemsSource = PreviewList;
我也嘗試過設置數據上下文和itemsource以及刷新:
QuotePreviewDataGrid.Items.Refresh();
我在我的應用程序的其余部分設置為列表框的數據綁定工作完美。 在列表框中,我將itemsource設置為{Binding},將ListItems綁定設置為{Binding Property}。 后面的代碼中設置的列表框的datacontext。
我的數據網格以相同的方式設置,但由於某種原因,網格內部沒有顯示任何內容。
當我瀏覽調試器並觀察信息流時,我可以看到正在創建T列表,SelectionsList並將其傳遞給數據網格所在的用戶控件的構造函數。 我可以看到DataContext確實正在設置並顯示列表中的項目,但是當我回到我的應用程序並嘗試查看數據網格時,它是空白的。
任何幫助將不勝感激。 在過去的一天半里,我一直在試圖解決這個問題。 謝謝!
UPDATE
SelectionList的設置如下:
public class SelectionList : List<Selection>
{
public List<Selection> availableSelections = new List<Selection>();
public List<Selection> AvailableSelections
{
get { return availableSelections; }
}
}
然后通過以下方式定義選擇:
public class Selection : DependencyObject
{
public bool IsChecked { get; set; }
public string ModelNumber { get; set; }
public string Description { get; set; }
public string Price { get; set; }
}
當應用程序啟動時,我會構建現有產品的目錄(選擇)。 在不同的選項卡上,每個產品系列都有一個選項卡,產品列表框的datacontext將使用從目錄中獲取的可用產品進行初始化。 然后,等待用戶選擇的產品,與該產品相關聯的可用選項或子選擇被填充到適當的列表框,附件和保證中。
一旦用戶選擇了他們想要的選項,就會點擊一個按鈕來預覽應該填充上述數據網格的所選項目。
我可以構建所選選項的列表,但是當我嘗試設置數據網格的數據上下文時,沒有任何內容出現。 可用選項的列表構建並設置為適當的數據上下文,就像我嘗試為數據網格一樣,但數據網格不希望顯示我的信息。
UPDATE
所以經過一些調試后,我把問題縮小了一點。 數據綁定可以正常工作。 我沒有真正的問題,我不這么認為。 但是,我現在遇到的問題是我認為是我的用戶控件的兩個不同實例,但只顯示原始文件,而不是更新的副本。
這是一個關於類的副本,我添加了幾行來幫助調試問題。
public partial class QuotePreview : UserControl
{
private SelectionList _selectionList;
private SelectionList temp;
public QuotePreview()
{
InitializeComponent();
_selectionList = (SelectionList)this.DataContext;
}
private void QuotePreview_Loaded(object sender, RoutedEventArgs e)
{
_selectionList.SelectedOptions.Add(
new Selection
{
ModelNumber = "this",
Description = "really",
Price = "sucks"
});
}
public QuotePreview(SelectionList selectedOptions)
{
InitializeComponent();
_selectionList = (SelectionList)this.DataContext;
temp = selectedOptions;
_selectionList.AddRange(selectedOptions);
QuotePreview_Loaded();
}
private void QuotePreview_Loaded()
{
foreach (var options in temp.SelectedOptions)
{
_selectionList.SelectedOptions.Add(options);
}
QuotePreviewDataGrid.ItemsSource = _selectionList.SelectedOptions;
}
}
每次單擊用戶控件/選項卡時,都會調用默認構造函數的實現。 發生這種情況時,_selectionList設置為用戶控件的數據上下文,然后是Loaded Event,它將一行添加到我的數據網格中。
在另一個用戶控件中,我選擇了要添加到數據網格用戶控件的選項,單擊一個按鈕,創建一個我想要添加的選項列表,並調用我編寫的自定義構造函數。 一旦構造函數完成,它就會調用我為shits和giggles創建的自定義Loaded Event方法,它將所選選項添加到我的_selectionList中。
現在,一旦我再次單擊數據網格用戶控件,它將完成整個默認過程,並添加另一個默認行。
如果我返回一個選項卡並說我再次想要這些選項並返回到數據網格,它將再次通過默認進程並添加另一個默認行。
最有趣的是,我可以看到兩個選擇列表構建,因為我不清楚進程之間。 我看到了要顯示的選項的列表構建以及默認選項構建的列表構建...
哦,同樣,SelectionList確實實現了ObservableCollection。
我終於找到了解決問題的方法。
public static class QuotePreview
{
public static ObservableCollection<PurchasableItem> LineItems { get; private set; }
static QuotePreview()
{
LineItems = new ObservableCollection<PurchasableItem>();
}
public static void Add(List<PurchasableItems> selections)
{
foreach (var selection in selections)
{
LineItems.Add(selection);
}
}
public static void Clear()
{
LineItems.Clear();
}
}
public class QuoteTab : TabItem
{
public ObservableCollection<PurchasableItem> PreviewItems { get; private set; }
public QuoteTab()
{
Initialize()
PreviewItems = QuotePreview.LineItems;
DataGrid.ItemSource = PreviewItems
}
}
嘗試改變:
QuotePreviewDataGrid.DataContext = previewList;
至
this.DataContext = previewList;
我懷疑你的xaml中的ItemsSource="{Binding}"
是否覆蓋了構造函數中的DataContext代碼。
通過將previewList更改為整個UserControl的DataContext,DataGrid的ItemsSource
的綁定可以正確評估。
另外,我將開始研究使用ObservableCollection<T>
和MVVM設計模式。 您最終可能遇到的一個問題是,當基礎列表發生更改時,您的DataGrid
不會更新,使用ObservableCollection<T>
將解決此問題。
使用MVVM設計模式可以從物理顯示(DataGrid)中很好地分離邏輯和數據(在本例中是列表及其加載方式)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.