Wpf datagrid在运行时不反映将项添加到DataSource的时间

6pp0gazn  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(342)

问题:当项添加到DataSource时,数据网格不会在运行时进行反映。
注意:当我单击另一个视图并返回到包含数据网格的视图时,它会反映添加的项。但是这是不希望的,因为视图实际上是重新生成的,这导致当前状态的丢失。
数据源:数据源是在visual studio(本地db)中使用Entity FrameworkCore创建的表。
代码:
显示绑定的数据网格

<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类(PartViewModel、BaseViewModel和PartCommand)的绑定属性和构造函数

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

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

public void LoadPart()
{
    _parts = new ObservableCollection<Part>(PartDataAccess.GetPart());
}

public class BaseViewModel : INotifyPropertyChanged
{
        public event PropertyChangedEventHandler? PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
       PropertyChanged?.Invoke(this, new 
       PropertyChangedEventArgs(propertyName));
    }
}

public class PartCommand : BaseCommand
{
   private readonly PartViewModel _viewModel;
   public PartCommand(PartViewModel viewModel)
   {
      _viewModel = viewModel;            
   }
   public override void Execute(object? parameter)
   {          
      PartDataAccess.AddPart(_viewModel.PartIdToDb, 
     _viewModel.PartDescription, _viewModel.PartQuantity, 
     _viewModel.PartTag, _viewModel.UserIdToDb);

     _viewModel.LoadPart();
   }            
}

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

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;
    }
}

注意:为了清楚起见,我只展示了一小部分代码。如果需要更多的信息,我很乐意提供。
我尝试过的:
我创建了一个集合作为数据库,并使用相同的属性和绑定将其连接到datagrid。它工作正常。

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;
}
cwxwcias

cwxwcias1#

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

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

变更

OnPropertyChanged(nameof(Part))

OnPropertyChanged(nameof(Parts))

编辑:Clarity

sqougxex

sqougxex2#

解决方案在这里:
问题源于LoadPart()方法中的这行代码:

_parts = new ObservableCollection<Part>(PartDataAccess.GetPart());

私有字段_parts应该替换为公共属性Partsthis.Parts。现在正确的代码将是:

this.Parts = new ObservableCollection<Part>(PartDataAccess.GetPart());

非常感谢大家的帮助!

相关问题