Wpf 数据网格在将项目添加到 DataSource 时不会在运行时反映

问题描述 投票:0回答:1

多年来我一直在使用 Stackoverflow 来解决不同的技术问题,我通常最终会找到答案。我无法解决这个问题,已经花了一个多星期的时间寻找并试图解决这个问题,现在它变得荒谬了。所以这是我关于 SO 的第一个问题。

问题:将项目添加到 DataSource 时,数据网格不会在运行时反映出来。
注意:当我单击另一个视图并返回到包含数据网格的视图时,它确实反映了添加的项目。但这是不可取的,因为视图实际上是重新生成的,这会导致当前状态的丢失。

数据源:数据源是使用 Entity FrameworkCore 在 visual studio(本地数据库)中创建的表。

代码:

显示绑定的数据网格

           <Grid Grid.Row="4">
                <DataGrid
                    x:Name="DatagridPart"
                    Grid.Row="4"
                    AutoGenerateColumns="False"
                    ItemsSource="{Binding Parts, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding PartId, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Header="Part No" />
                        <DataGridTextColumn Binding="{Binding PartDescription, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Header="Description" />
                        <DataGridTextColumn Binding="{Binding PartQuantity, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Header="Quantity" />
                        <DataGridTextColumn Binding="{Binding PartTag, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Header="Tags" />
                        <DataGridTextColumn Binding="{Binding UserID, UpdateSourceTrigger=PropertyChanged}" Header="Added by" />
                    </DataGrid.Columns>
                </DataGrid>
            </Grid>

ViewModel类的绑定属性和构造函数

        private ObservableCollection<Part> _parts;
        public ObservableCollection<Part> Parts
        {
            get
            {
                return _parts;
            }
            set
            {
                _parts = value;
                OnPropertyChanged(nameof(Part));
            }
        }

        //// Construction
        public PartViewModel()
        {
            CreateCommand = new PartCommand(this);
            Parts = PartDataAccess.GetPart();

        }
        public PartCommand CreateCommand { get; }

从数据库中检索数据的方法。

        public static ObservableCollection<Part> GetPart()
        {
            using (var db = new MikeInventoryContext())
            {
                return new ObservableCollection<Part>(db.Parts.ToList());
            }
        }

后面代码中设置的DataContext:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            PartViewModel partViewModel = new PartViewModel();
            this.DataContext = partViewModel;
        }
    }

注意:为了清楚起见,我只展示了一小部分代码。如果需要更多信息,我很乐意提供。

我尝试过的:

我创建了一个集合作为数据库,并使用相同的属性和绑定将它连接到数据网格。它工作正常。

        public static ObservableCollection<Part2> _DatabaseParts = new ObservableCollection<Part2> 
        { 
            new Part2(){PartId=100, PartDescription = "Plier", PartQuantity = 12, PartTag = "Plier", SupplierId = 100, UserID = 101}, 
            new Part2(){PartId=101, PartDescription = "Spanner", PartQuantity = 12, PartTag = "Spanner", SupplierId = 100, UserID = 102}
        };

        public static ObservableCollection<Part2> GetPart2()
        {
            return _DatabaseParts;
        }

我在 stackoverflow 和其他论坛上尝试过类似问题的多项建议,但均未成功。例如 ListView 不会在源更改时更新 - 即使我实现了 PropertyChanged.

老实说,我对此不知所措。任何帮助将不胜感激,在此先感谢您!迈克尔

c# wpf mvvm entity-framework-core datagrid
1个回答
0
投票

我认为这可能只是这部分代码的错别字。您为 OnPropertyChanged 通知函数指定了错误的类型名称。

public ObservableCollection<Part> Parts
{
    get
    {
        return _parts;
    }
    set
    {
        _parts = value;
        OnPropertyChanged(nameof(Part));
    }
}

改变

OnPropertyChanged(nameof(Part))

OnPropertyChanged(nameof(Parts))

编辑:清晰度

© www.soinside.com 2019 - 2024. All rights reserved.