我正在尝试在单独的UserControl中创建DataGrid,其DataContext是T的列表。
在后面的代码中,我创建一个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>
我已尝试使用
设置ItemSourceQuotePreviewDataGrid.ItemsSource = PreviewList;
我也尝试过设置数据上下文和itemsource以及刷新:
QuotePreviewDataGrid.Items.Refresh();
我在我的应用程序的其余部分设置为列表框的数据绑定工作完美。在列表框中,我将itemsource设置为{Binding},将ListItems绑定设置为{Binding Property}。在后面的代码中设置的列表框的datacontext。
我的数据网格设置方式相同,但出于某种原因,网格内没有显示任何内容。
当我浏览调试器并观察信息流时,我可以看到正在创建T列表,SelectionsList并将其传递给数据网格所在的用户控件的构造函数。我可以看到DataContext确实正在设置并显示列表中的项目,但当我回到我的应用程序并尝试查看数据网格时,它是空白的。
非常感谢任何帮助。在过去的一天半里,我一直在试图解决这个问题。谢谢!
更新
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将使用从目录中获取的可用产品进行初始化。然后,等待用户选择的产品,与该产品关联的可用选项或子选项将填充到相应的列表框,附件和保修中。
用户选择他们想要的选项后,会单击一个按钮以预览应该填充上述数据网格的所选项目。
我可以构建所选选项的列表,但是当我尝试设置数据网格的数据上下文时,什么都没有出现。可用选项的列表构建并设置为适当的数据上下文,就像我尝试为数据网格执行的一样,但数据网格不希望显示我的信息。
更新
经过一些调试后,我把问题缩小了一点。数据绑定可以正常工作。我没有真正的问题,我不这么认为。但是,我现在遇到的问题是我认为是我的用户控件的两个不同实例,但只显示原始文件,而不是更新的副本。
这是一个关于类的副本,我添加了几行来帮助调试问题。
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 :(得分: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
}
}
答案 1 :(得分:0)
尝试更改:
QuotePreviewDataGrid.DataContext = previewList;
到
this.DataContext = previewList;
我怀疑你的xaml中的ItemsSource="{Binding}"
是否覆盖了构造函数中的DataContext代码。
通过将previewList更改为整个UserControl的DataContext,DataGrid的ItemsSource
的绑定可以正确评估。
另外,我将开始研究ObservableCollection<T>
和MVVM设计模式的使用。您最终可能遇到的一个问题是,当基础列表发生更改时,您的DataGrid
不会更新,使用ObservableCollection<T>
会解决此问题。
使用MVVM设计模式可以让您从物理显示(DataGrid)中很好地分离您的逻辑和数据(在这种情况下是您的列表及其加载方式)