簡體   English   中英

WPF DataBinding ObservableCollection <T> 到DataGrid

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM