2013-02-27 31 views
6

Tôi đang cố gắng để tạo ra DataGrid trong một usercontrol riêng biệt mà DataContext là một danh sách của T.WPF DataBinding ObservableCollection <T> để DataGrid

Trong đoạn mã phía sau, tôi có thể tạo một danh sách, cư trong danh sách, sau đó gửi nó đến các nhà xây dựng cho UserControl mà tôi có DataGrid tôi đang cố gắng để cư trú.

Lớp UserControl như sau.

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

Và XAML trông giống như:

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

tôi đã cố gắng thiết lập các ItemSource cũng sử dụng

QuotePreviewDataGrid.ItemsSource = PreviewList; 

Tôi cũng đã cố gắng thiết lập cả hai bối cảnh dữ liệu và itemsource cũng như làm mới:

QuotePreviewDataGrid.Items.Refresh(); 

Databinding tôi đã thiết lập để listboxes trong phần còn lại của ứng dụng của tôi hoạt động hoàn hảo. Trong các hộp danh sách, tôi đã đặt itemsource thành {Binding} và liên kết ListItems thành {Binding Property}. Datacontext cho các hộp danh sách được đặt trong mã phía sau.

DataGrid của tôi ở đây được thiết lập theo cùng một cách, nhưng vì một lý do nào đó không có gì được hiển thị bên trong lưới.

Khi tôi đi qua trình gỡ lỗi và xem luồng thông tin, tôi có thể thấy Danh sách T, SelectionsList được tạo và được truyền cho hàm tạo cho điều khiển người dùng nơi lưới dữ liệu nằm. Tôi có thể thấy rằng DataContext thực sự đang được thiết lập và hiển thị các mục trong danh sách, nhưng khi tôi quay trở lại appication của tôi và cố gắng xem lưới dữ liệu, nó trống.

Mọi trợ giúp sẽ được đánh giá cao. Tôi đã cố gắng để bọc tâm trí của tôi xung quanh vấn đề này cho ngày cuối cùng và một nửa. Cảm ơn!

CẬP NHẬT

Các SelectionList được thiết lập như:

public class SelectionList : List<Selection> 
{ 
    public List<Selection> availableSelections = new List<Selection>(); 

    public List<Selection> AvailableSelections 
    { 
     get { return availableSelections; } 
    } 
} 

và sau đó một lựa chọn được xác định bởi:

public class Selection : DependencyObject 
{ 
    public bool IsChecked { get; set; } 
    public string ModelNumber { get; set; } 
    public string Description { get; set; } 
    public string Price { get; set; } 
} 

Khi ứng dụng bắt đầu, tôi xây dựng một danh mục các hiện sản phẩm (Lựa chọn). Trên các tab khác nhau, một cho mỗi gia đình sản phẩm, hộp văn bản cho hộp danh sách sản phẩm được khởi tạo với các sản phẩm có sẵn mà nó lấy từ danh mục. Sau đó, chờ xem sản phẩm nào người dùng chọn, các tùy chọn có sẵn hoặc lựa chọn con liên quan đến sản phẩm đó được điền vào các hộp danh sách, phụ kiện và bảo hành thích hợp.

Khi người dùng chọn tùy chọn họ muốn, một nút được nhấp để xem trước các mục đã chọn được cho là điền vào lưới dữ liệu được giải thích ở trên.

Tôi có thể tạo danh sách các tùy chọn đã chọn, tuy nhiên khi tôi cố gắng đặt ngữ cảnh dữ liệu của lưới dữ liệu, không có gì xuất hiện. Danh sách cho các lựa chọn có sẵn được xây dựng và thiết lập cho bối cảnh dữ liệu thích hợp giống như cách tôi đang cố gắng thực hiện nó cho lưới dữ liệu, tuy nhiên lưới dữ liệu không muốn hiển thị thông tin của tôi.

CẬP NHẬT

Vì vậy, sau một số lỗi nhiều hơn, tôi đã thu hẹp vấn đề xuống một chút. Các ràng buộc dữ liệu hoạt động như nó cần. Tôi không có vấn đề thực sự ở đó, tôi không nghĩ. Tuy nhiên, vấn đề tôi đang gặp phải bây giờ là những gì tôi tin là 2 trường hợp khác nhau của User Control của tôi, nhưng chỉ có bản gốc đang được hiển thị chứ không phải bản sao được cập nhật.

Đây là bản sao của lớp học từ khoảng một vài dòng mà tôi đã thêm vào để giúp gỡ lỗi sự cố.

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

Việc triển khai hàm tạo mặc định, được gọi mỗi lần kiểm soát/tab của người dùng được nhấp vào. Khi điều đó xảy ra, _selectionList được đặt thành ngữ cảnh dữ liệu của điều khiển người dùng, theo sau là Sự kiện được tải có thêm một dòng vào lưới dữ liệu của tôi.

Trong điều khiển người dùng khác nơi tôi chọn tùy chọn tôi muốn thêm vào điều khiển người dùng lưới dữ liệu, tôi nhấp vào nút tạo danh sách tùy chọn tôi muốn thêm và gọi hàm tạo tùy chỉnh mà tôi đã viết. Khi hàm khởi tạo kết thúc, nó gọi phương thức Event Loaded tùy chỉnh mà tôi đã tạo cho shits và giggles, thêm các tùy chọn đã chọn vào _selectionList của tôi.

Bây giờ, khi tôi nhấp lại vào điều khiển người dùng lưới dữ liệu, nó sẽ trải qua toàn bộ quá trình mặc định và thêm một dòng mặc định khác.

Nếu tôi quay trở lại tab và nói rằng tôi muốn các tùy chọn này một lần nữa và quay trở lại lưới dữ liệu, nó lại trải qua quá trình mặc định và thêm một dòng mặc định khác.

Điều thú vị nhất mặc dù là tôi có thể nhìn thấy cả hai selectionLists xây dựng kể từ khi tôi không rõ ràng ở giữa các quá trình. Tôi thấy danh sách các tùy chọn tôi muốn hiển thị và danh sách xây dựng các tùy chọn mặc định được tạo ...

Ồ, ngoài ra, SelectionList cũng thực hiện ObservableCollection.

+0

Bạn có nghĩa là lưới dữ liệu liên kết được liệt kê, không phải theo cách khác. –

+0

Tôi tự hỏi, bạn có bất kỳ lỗi liên kết dữ liệu nào trong đầu ra của mình không? Nếu bạn đang sử dụng Visual Studio, bạn có thể mở "Cửa sổ đầu ra" và kiểm tra các lỗi liên kết dữ liệu. nếu điều đó không hiệu quả, hãy thử sử dụng [Snoop] (http://snoopwpf.codeplex.com/) và xem liệu bạn có thể thấy bất kỳ vấn đề nào không (ví dụ bạn có thể định vị datacontext và xem nó là gì) và nhận trở lại với kết quả – Default

Trả lời

2

Cuối cùng tôi đã đưa ra một giải pháp cho vấn đề.

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

hãy thử thay đổi:

QuotePreviewDataGrid.DataContext = previewList; 

để

this.DataContext = previewList; 

nghi ngờ của tôi là ItemsSource="{Binding}" trong XAML của bạn được trọng mã DataContext trong constructor của bạn.

Bằng cách thay đổi danh sách xem trước thành DataContext của toàn bộ UserControl, thì ràng buộc của DataGrid là ItemsSource có thể đánh giá chính xác.

Một lưu ý phụ, tôi sẽ bắt đầu xem xét việc sử dụng ObservableCollection<T> và mẫu thiết kế MVVM. Một vấn đề mà bạn có thể kết thúc là DataGrid của bạn không cập nhật khi danh sách cơ bản thay đổi, sử dụng ObservableCollection<T> sẽ khắc phục sự cố này.

Sử dụng các mẫu thiết kế MVVM sẽ cung cấp cho bạn một tách tốt của logic và dữ liệu của bạn (trong trường hợp này danh sách của bạn và làm thế nào nó được nạp) từ màn hình vật lý (DataGrid)

+0

ok, vì vậy tôi đã thử thực hiện các thay đổi bạn đã đề xuất không có kết quả. Tôi thực sự đã sẵn sàng thử thiết lập this.DataContext = previweList; để loại trừ khả năng đó. Tôi cũng đã thay đổi, previewList là một ObservableCollection và dữ liệu của tôi vẫn không hiển thị. – Chutes

+0

Chúng ta có thể thấy định nghĩa của các mục của 'SelectionList'? –

+0

được cập nhật trong câu hỏi ở trên – Chutes

Các vấn đề liên quan