2013-02-27 102 views
6

我想在一個單獨的用戶控件,其DataContext的創建DataGrid的是T.WPF數據綁定的ObservableCollection <T>到DataGrid中

的列表在後面的代碼,我創建了一個列表,填充列表,然後將其發送到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設置在後面的代碼中。

我的datagrid在這裏設置的方式是相同的,但由於某種原因網格內沒有顯示任何內容。

當我通過調試器並觀察信息流時,我可以看到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。

+0

您的意思是綁定數據網格列表,而不是其他方式。 – 2013-02-27 23:22:50

+0

我在想,你的輸出中是否有數據綁定錯誤?如果您使用Visual Studio,則可以打開「輸出窗口」並檢查數據綁定錯誤。如果這沒有幫助,請嘗試使用[Snoop](http://snoopwpf.codeplex.com/)並查看是否可以在其中看到任何問題(例如,可以找到datacontext並查看它是什麼)並獲取結果 – Default 2013-02-28 07:38:19

回答

2

我終於想出了一個解決方案解決問題。

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 
    } 
} 
0

嘗試改變:

QuotePreviewDataGrid.DataContext = previewList; 

this.DataContext = previewList; 

我懷疑是在你的XAML中ItemsSource="{Binding}"被覆蓋在你的構造DataContext的代碼。

通過將previewList更改爲整個UserControl的DataContext,然後可以正確評估DataGrid的ItemsSource的綁定。

在附註上,我將開始研究使用ObservableCollection<T>和MVVM設計模式。您最終可能會遇到的問題是,DataGrid在底層列表更改時不會更新,使用ObservableCollection<T>可以解決此問題。

從物理顯示器使用MVVM設計模式將會給你的邏輯和數據的良好分離(在這種情況下,你的清單,它是如何加載)(DataGrid中)

+0

好,所以我試圖做出你建議的改變無濟於事。我實際上已經準備好嘗試設置 this.DataContext = previweList;排除這種可能性。我也改變了,預覽列表是一個ObservableCollection 和我的數據仍然不顯示。 – Chutes 2013-02-27 22:50:54

+0

我們可以看到'SelectionList'的項目的定義嗎? – 2013-02-27 22:59:23

+0

上面的問題更新 – Chutes 2013-02-27 23:23:03

相關問題