我遇到了DataGrid
在输入新记录后没有新空行的问题。
似乎只有在更新ObversableCollection<T>
后才会发生。
我用它来绑定到集合:
public partial class MainWindow : INotifyPropertyChanged
{
public MainWindow()
{
DataContext = this;
InitializeComponent();
CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");
CalculationTableGrid.ItemsSource = CalculationTblSourceObserv;
}
public ObservableCollection<CalculationListTbl> CalculationTblSourceObserv { get; set; }
= new ObservableCollection<CalculationListTbl>();
}
这是我更新ObversableCollection<T>
的代码:
class CollectionLists
{
public static void CalculationTableSourceCollection(ObservableCollection<CalculationListTbl> observable,
string section, string sectionAll)
{
using (DatabaseDataContext dataContext = new DatabaseDataContext(MainWindow.InstanceConnectionString))
{
observable.Clear();
var source = DatabaseQueries.CalculationTableSourceAll(sectionAll, dataContext);
if (source == null) return;
foreach (var item in source)
{
observable.Add(item);
}
}
}
}
这就是XAML:
<DataGrid x:Name="CalculationTableGrid" Grid.Column="2"
AutoGenerateColumns="False" ItemsSource="{Binding}"
Grid.Row="1" Grid.RowSpan="12" AlternationCount="2"
CanUserAddRows="True" CanUserSortColumns="False"
CanUserDeleteRows="True" GridLinesVisibility="None"
CellEditEnding="CalculationTableGrid_OnCellEditEnding"
VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTextColumn Width="*" Header="項目"
Binding="{Binding UpdateSourceTrigger=PropertyChanged, Path=ListItems, Mode=TwoWay}" />
</DataGrid.Columns>
</DataGrid>
我使用此方法更新dataGrid
:
private void CalculationTableGrid_OnCellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
{
ShiftTypeData.UserInputData.AddNewDataShiftInputRecords(e, MainUserId, EmployeesNameNumberPairsAll, CalculationTblListObserv, DateFilter);
CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");
}
所以一切正常,在插入新记录后,DataGrid' is updated, the database is correctly updated and the
ObversableCollection is updated. However the
DataGrid`应该添加一个新行,但这就是它的作用。
这就是它的作用,
但是,在CollectionLists.CalculationTableSourceCollection(CalculationTblSourceObserv, @"section", @"sectionAll");
事件中注释掉这一行CalculationTableGrid_OnCellEditEnding
可以使其正确行为,并在制作新记录后添加一个空行,如下所示:
这里发生了什么,我无法正常工作,任何帮助都会非常感激。
答案 0 :(得分:1)
您似乎正在更新属性CalculationTblSourceObserv
,但您已在xaml中限制了属性ListItems
。所以要么在xaml中绑定CalculationTblSourceObserv
,要么可以执行以下操作。
在您的问题中,我无法查看代码的哪一部分属性&#39; ListItems&#39;存在,这是绑定到数据网格的属性。希望这是一个视图模型。
所以要么你的财产&#39; ListItems&#39;没有得到更新,或者如果它正在更新,那么您的xaml不会收到有关该更改的通知。您的视图模型代码应通知xaml已更新属性。这是通过引发属性更改事件来完成的,可以这样做:
public string ListItems
{
get { return listItems; }
set
{
listItems= value;
// Call OnPropertyChanged whenever the property is updated
OnPropertyChanged("ListItems");
}
}
// Create the OnPropertyChanged method to raise the event
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
答案 1 :(得分:1)
此处的问题是,在添加新项目时会引发CellEditEnding
事件,然后您立即在CalculationTableSourceCollection
方法中清除CalculationTableSourceCollection
。
您根本不必在CalculationTableSourceCollection
事件处理程序中调用CellEditEnding
方法。
您添加或移除到ObservableCollection<T>
的任何项目都会自动显示在DataGrid
中。这是ObservableCollection<T>
与List<T>
不同的原因。后者没有实现INotifyCollectionChanged接口。