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