c# - DbSet 和 ObservableCollection 之间的转换

标签 c# wpf mvvm datagrid observablecollection

构建一个 WPF 应用程序并尝试使事情变得相当简单。
目的是我有一个绑定(bind)到 Observable 集合的数据网格。在后台运行的频繁任务将定期将项目添加到集合中,我希望这些项目立即显示在 UI 数据网格上。
我遇到的两个问题:

  • 当集合更新时,数据网格不会。如果我的 ServiceLayer 知道有关 UserControl 的任何信息,我只会调用 Datagrid.Refresh(),但它不知道,所以我不能。我知道我需要某种 PropertyChanged 事件来触发,我可以在我的代码中引发自定义事件,但是如何让 View 响应?

  • 我的 Xaml - 稍后我将正确格式化数据网格。
    <UserControl x:Class="FrontEnd.Views.ItemsView"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:FrontEnd.Views"
                 mc:Ignorable="d" 
                 d:DesignHeight="450" d:DesignWidth="800"
                 DataContext="{Binding ViewModel, Source={StaticResource ViewModelLocator}}">
        <Grid>
            <DataGrid x:Name="Items" 
                      HorizontalAlignment="Left" 
                      Height="auto" 
                      VerticalAlignment="Top" 
                      Width="auto" 
                      AutoGenerateColumns="True"
                      ColumnWidth="*"
                      ItemsSource="{Binding ExistingItems}">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Title}" Width="Auto"/>
                </DataGrid.Columns>
            </DataGrid>
    
        </Grid>
    </UserControl>
    
    
    
    public ObservableCollection<Item> ExistingItems
            {
                get
                {
                    return _existingItems;
                }
                private set
                {
                    _existingItems = value;
                    //Raise PropertyChangedEvent?
                }
            }
    
    第二个问题是在 DataLayer - Item 有一个 Group 表的外键,当我显示 Items 时,我想显示 Group 的名称,所以我的 DataLayer 中有以下内容
    ICollection items = _context.Items.Include(i => i.Group);
    return items;
    
    但是现在我想让 Items Observable,我不能这样做 - 我可以使用
    ObservableCollection items = _context.Items.Local;
    return items;
    
    返回一个不包含 Group 实体数据的 ObservableCollection,但是我需要单独获取 Group 数据并在 ViewModel 中进行基于代码的连接,而我不想这样做。
    return (ObservableCollection<Item>)_context.Items.Include(i => i.Group);
    
    不出所料地在运行时失败。
    我觉得我在这两个问题上都遗漏了一些明显的东西。有人可以建议吗?

    最佳答案

    您应该 implement INotifyPropertyChanged接口(interface)并提出PropertyChanged来自 ExistingItems 的 setter 的事件属性,或者只是将新项目添加到 ObservableCollection<Item> 的现有实例中而不是创建一个新的:

    ExistingItems.Clear();
    foreach (vew newItem in collectionFromDal)
        ExistingItems.Add(newItem);
    
    您的 DAL 应该返回一个集合:
    _context.Items.Include(i => i.Group).ToArray();
    
    或者
    new ObservableCollection<Item>(_context.Items.Include(i => i.Group));
    
    理想情况下,您将创建 ObservableCollection<Item>在客户端应用程序的 View 模型中。

    关于c# - DbSet 和 ObservableCollection 之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62797663/

    相关文章:

    c# - 如何使用 MVVM 在组合框中设置默认文本

    c# - 如何在 visual studio 2010 中提升 XAML 设计器?

    c# - 在流程文档的新创建段落上设置插入符号位置

    mvvm - 剑道 mvvm : how to define a custom css binding

    c# - WPF按钮单击和命令不能一起工作MVVM

    c# - 如何获取 LightSwitch 中 IContentItemProxy 上的 SetBinding 方法的路径?

    c# - 单个 API 类加载其他类的设计模式

    c# - 如何更改文本框焦点颜色?

    c# - 将 COM 对象添加到 Asp Net Core

    javascript - ExtJS 5.1.1 立即在 ViewModel 中触发绑定(bind)