添加新项时,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/

添加新项时,DataGrid未触发集合设置器

您可以尝试在事件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;
        }