[英]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.