簡體   English   中英

作為 dataGrid 一部分的復選框 - 如何以正確的順序調用綁定數據的事件

[英]Checkbox as part of dataGrid - how to call event on bound data in the right order

一旦復選框值發生更改,我正在嘗試根據數據網格中的復選框值執行計算,但我正在努力。 我認為問題的一部分是事件的時間安排。

數據網格綁定到一個可觀察的集合。 我已經通過價值觀會立即更新,但似乎沒有。

下面是 xaml:

<Window x:Class="GridViewTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:GridViewTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
   <DockPanel>
      <GroupBox Header="Data"  Grid.Row ="1" Margin="0,0,0,0" DockPanel.Dock="Top" Height="100">
         <DataGrid x:Name="dataGrid" Margin="0,0,0,0"  AutoGenerateColumns="False" 
                         CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False" 
                         CanUserResizeColumns="False" CanUserReorderColumns="False" VerticalAlignment="Stretch" >
            <DataGrid.Columns>
               <DataGridCheckBoxColumn Header="Flag" Binding="{Binding Path=flag}" Width="35" IsReadOnly="false">
                  <DataGridCheckBoxColumn.CellStyle>
                     <Style>
                        <EventSetter Event="CheckBox.Checked" Handler="UseCheckboxChanged"/>
                        <EventSetter Event="CheckBox.Unchecked" Handler="UseCheckboxChanged"/>
                     </Style>
                  </DataGridCheckBoxColumn.CellStyle>
               </DataGridCheckBoxColumn>
               <DataGridTextColumn Header="Value" Binding="{Binding Path=dataValue, StringFormat=N3}" Width="50" IsReadOnly="True"/>
            </DataGrid.Columns>
         </DataGrid>
      </GroupBox>
      <Button x:Name="myButton" Content="Count" DockPanel.Dock="Top" Height="100" Click="myButton_Click"/>
      <TextBox x:Name="myTextBox" DockPanel.Dock="Top" Height="25"/>
   </DockPanel>
</Window>

和代碼:

namespace GridViewTest
{
  public class Data
  {
    private bool _flag;
    public bool flag { get; set; }
    public double dataValue { get; set; }
    public Data()
    {
      flag = false;
      dataValue = 0;
    }
  }

  public partial class MainWindow : Window
  {
    ObservableCollection<Data> dataCol = new ObservableCollection<Data>();
    public MainWindow()
    {
      InitializeComponent();
      dataCol = new ObservableCollection<Data>();
      Data dataPt1 = new Data();
      dataPt1.flag = false;
      dataPt1.dataValue = 1.23;
      Data dataPt2 = new Data();
      dataPt2.flag = true;
      dataPt2.dataValue = 2.34;
      dataCol.Add(dataPt1);
      dataCol.Add(dataPt2);
      dataGrid.ItemsSource = dataCol;
    }
    private void UseCheckboxChanged(object sender, RoutedEventArgs e)
    {
      performCount();
    }
    public void performCount()
    {
      int count = 0;
      double sum = 0;
      foreach (Data dataPt in dataCol)
      {
        if (dataPt.flag)
        {
          count++;
          sum += dataPt.dataValue;
        }
      }
      this.myTextBox.Text = count.ToString() + "|" + sum.ToString();
    }
    private void myButton_Click(object sender, RoutedEventArgs e)
    {
      performCount();
    }
  }
}

我的 function 在“CheckBox.Checked”和“CheckBox.UnChecked”上調用了“performCount”,但它使用舊值,所以當我第一次運行代碼並選中/取消選中一個框時,文本框中的值不改變。 然后,如果我再次單擊復選框,則顯示的值就是以前應該的值。 所以事件似乎發生在 ObservableCollection 更新之前。 如果我單擊按鈕,它會顯示正確的值。

在運行計算之前進行可觀察集合更新的正確方法是什么?

添加UpdateSourceTrigger=PropertyChanged到 DataGridCheckBoxColumn 綁定:

<DataGridCheckBoxColumn 
    Header="Flag" 
    Binding="{Binding Path=flag, UpdateSourceTrigger=PropertyChanged}" 
    Width="35" 
    IsReadOnly="false">

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM