2013-02-27 99 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

相关问题