问题:当项添加到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;
}
2条答案
按热度按时间cwxwcias1#
我认为这可能只是这部分代码中的一个错字。为OnPropertyChanged通知函数指定了错误的类型名称。
变更
到
编辑:Clarity
sqougxex2#
解决方案在这里:
问题源于
LoadPart()
方法中的这行代码:私有字段
_parts
应该替换为公共属性Parts
或this.Parts
。现在正确的代码将是:非常感谢大家的帮助!