多年来我一直在使用 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.
老实说,我对此不知所措。任何帮助将不胜感激,在此先感谢您!迈克尔
我认为这可能只是这部分代码的错别字。您为 OnPropertyChanged 通知函数指定了错误的类型名称。
public ObservableCollection<Part> Parts
{
get
{
return _parts;
}
set
{
_parts = value;
OnPropertyChanged(nameof(Part));
}
}
改变
OnPropertyChanged(nameof(Part))
到
OnPropertyChanged(nameof(Parts))
编辑:清晰度