gpt4 book ai didi

c# - WPF 数据绑定(bind) ObservableCollection 到 DataGrid

转载 作者:太空狗 更新时间:2023-10-29 20:36:54 24 4
gpt4 key购买 nike

我正在尝试在一个单独的 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>

我也尝试使用设置 ItemSource
QuotePreviewDataGrid.ItemsSource = PreviewList;

我还尝试设置数据上下文和项目源以及刷新:
QuotePreviewDataGrid.Items.Refresh();

我在应用程序的其余部分设置为列表框的数据绑定(bind)工作得很好。在列表框中,我将 itemsource 设置为 {Binding},并将 ListItems 绑定(bind)设置为 {Binding Property}。在后面的代码中设置的列表框的数据上下文。

我这里的数据网格以相同的方式设置,但由于某种原因,网格内没有显示任何内容。

当我通过调试器并观察信息流时,我可以看到正在创建的 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; }
}

当应用程序启动时,我会构建一个现有产品(选择)的目录。在不同的选项卡上,每个产品系列一个,产品列表框的数据上下文用它从目录中获取的可用产品进行初始化。然后等待用户选择哪个产品,与该产品相关联的可用选项或子选项被填充到适当的列表框、附件和保证中。

一旦用户选择了他们想要的选项,点击一个按钮来预览应该填充上面解释的数据网格的所选项目。

我可以构建所选选项的列表,但是当我尝试设置数据网格的数据上下文时,什么也没有出现。可用选择的列表构建并设置为适当的数据上下文,就像我尝试为数据网格做的那样,但是数据网格不想显示我的信息。

更新

所以经过一些更多的调试后,我把问题缩小了一点。数据绑定(bind)正常工作。我在那里没有真正的问题,我不认为。但是,我现在遇到的问题是我认为我的用户控件有 2 个不同的实例,但只显示原始版本,而不是更新后的副本。

这是 about 类的副本,我添加了几行来帮助调试问题。
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 被设置为用户控件的数据上下文,然后是加载事件,它向我的数据网格添加一行。

在另一个用户控件中,我选择要添加到数据网格用户控件的选项,单击一个按钮,该按钮创建了我要添加的选项列表并调用我编写的自定义构造函数。构造函数完成后,它会调用我为狗屎和傻笑创建的自定义加载事件方法,该方法将选定的选项添加到我的 _selectionList。

现在,一旦我再次单击数据网格用户控件,它就会经历整个默认过程,并添加另一个默认行。

如果我返回一个选项卡并说我再次想要这些选项并返回到数据网格,它会再次通过默认过程并添加另一个默认行。

最有趣的是我可以看到两个 selectionLists 构建,因为我没有清除进程之间的。我看到了我想要显示的选项的列表构建和默认选项构建的列表构建...

哦,还有,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
}
}

关于c# - WPF 数据绑定(bind) ObservableCollection<T> 到 DataGrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15122811/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com