添加新项时,DataGrid未触发集合设置器
本文关键字:集合 设置 新项时 DataGrid 添加 | 更新日期: 2023-09-27 18:28:33
我有一个包含两个文本列和一个复选框列的数据网格。每当用户手动输入值并用制表符输入新行时,ItemsSource
不会得到更新(集合的setter不会触发)
<DataGrid HeadersVisibility="Column" RowHeaderWidth="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding Parameters}"
CanUserAddRows="True" AutoGenerateColumns="False" CanUserDeleteRows="True" MinHeight="140" Style="{StaticResource ParametersDataGridStyle}"
IsSynchronizedWithCurrentItem="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Key" Binding="{Binding Key}" Width="*"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*"/>
<DataGridCheckBoxColumn Header="Post parameter" Binding="{Binding IsPostParameter}" Width="Auto" />
</DataGrid.Columns>
</DataGrid>
如何使其与属性同步?我应该实施INotifyCollectionChanged
吗?我应该在一个单独的集合类中这样做吗?比如这个例子:
http://www.c-sharpcorner.com/UploadFile/yougerthen/C-Sharp-and-xaml-within-a-silverlight-2-context-inotifycollectionchanged-implementation-part-v/
您可以尝试在事件CollectionChanged中订阅集合。当调用该方法时,您将在列表中获得有关所做操作的所有信息。例如,添加或删除的元素。。。
您可以通过CollectionChanged事件进行检查,当添加新行时,集合的计数会发生变化
Xaml
<DataGrid HeadersVisibility="Column" RowHeaderWidth="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding Parameters,Mode=TwoWay}"
CanUserAddRows="True" AutoGenerateColumns="False" CanUserDeleteRows="True" MinHeight="140"
IsSynchronizedWithCurrentItem="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Key" Binding="{Binding Key,Mode=TwoWay}" Width="*"/>
<DataGridTextColumn Header="Value" Binding="{Binding Value,Mode=TwoWay}" Width="*"/>
<DataGridCheckBoxColumn Header="Post parameter" Binding="{Binding IsPostParameter,Mode=TwoWay}" Width="Auto" />
</DataGrid.Columns>
</DataGrid>
背后的代码
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Parameters = new ObservableCollection<ParamaterClass>();
Parameters.CollectionChanged += Parameters_CollectionChanged;
ParamaterClass ParamaterClass = new ParamaterClass();
ParamaterClass.Key = "Test1Key";
ParamaterClass.Value = "Test1Value";
ParamaterClass.IsPostParameter = true;
Parameters.Add(ParamaterClass);
}
void Parameters_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
int count = Parameters.Count;
}