【问题标题】:Checkbox event that fires AFTER the value has changed值更改后触发的复选框事件
【发布时间】:2013-08-03 12:28:00
【问题描述】:

我正在创建我的第一个 wpf 应用程序。此时我需要一个在复选框的值发生更改后触发的事件,因此选中和未选中不在图片中:-(

我有一个数据网格,绑定到一个可观察的集合。在这个数据网格中,我有一列带有复选框(绑定到 observ.col. 中的一个属性)。 表单上的文本框显示“总值”,即所有选中项的值的总和。因此,当检查/未选中时,我需要重新计算总值。为此,我遍历了 observ 的项目。上校但是,当我附加“选中”和“未选中”事件时。首先计算总值。然后检查值被更改。

有没有办法改变检查值,然后触发事件?

谢谢,

一月

<DataGrid AutoGenerateColumns="False" Height="305" Margin="105,137,0,0" Name="GrdReceivings" VerticalAlignment="Top" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" ItemsSource="{Binding}" HorizontalAlignment="Left" Width="850" SelectionMode="Single" CanUserAddRows="False" CanUserDeleteRows="False" SelectedCellsChanged="GrdReceivings_SelectedCellsChanged" MouseDoubleClick="GrdReceivings_MouseDoubleClick" IsEnabled="True">
    <DataGrid.Columns>
            <DataGridCheckBoxColumn MinWidth="40" Binding="{Binding Path=Selected}" >
                <DataGridCheckBoxColumn.CellStyle>
                    <Style>
                        <EventSetter Event="CheckBox.Checked" Handler="OnCheck"/>
                        <EventSetter Event="CheckBox.Unchecked" Handler="OnUncheck"/>
                    </Style>
                </DataGridCheckBoxColumn.CellStyle>
            </DataGridCheckBoxColumn>
...

【问题讨论】:

  • 有什么问题?
  • 所以当一个复选框被选中/取消选中时,我需要重新计算总值。为此,我遍历了 observ 的项目。上校但是,当我附加“选中”和“未选中”事件时。首先计算总值。然后更改检查值。这意味着显示的值永远不会正确。我需要它是正确的。
  • 那么你可以做相反的事情......如果它被检查出来,如果没有检查应该发生什么......因为你没有检查它但它返回检查......你可以尝试点击事件也
  • 不可能。假设我有 5 个项目。我选中(或取消选中)其中一个。这意味着通常我将有 4 个项目的值得到正确求和,1 个项目的总和不正确。如果我扭转这个过程,我将有 4 项错误地求和,1 项正确地求和。我需要正确总结 5 项。似乎我也不知道哪个复选框被选中/取消选中,因为它们在数据网格中。
  • 您是否检查过点击事件发生了什么,它返回了什么值或点击后类似的事件

标签: c# wpf events checkbox observablecollection


【解决方案1】:

感谢 Sheridan & Clemens,它成功了。制定好的答案:

<DataGrid AutoGenerateColumns="False" Height="305" Margin="105,137,0,0" Name="GrdReceivings" VerticalAlignment="Top" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" ItemsSource="{Binding}" HorizontalAlignment="Left" Width="850" SelectionMode="Single" CanUserAddRows="False" CanUserDeleteRows="False" SelectedCellsChanged="GrdReceivings_SelectedCellsChanged" MouseDoubleClick="GrdReceivings_MouseDoubleClick" IsEnabled="True">
    <DataGrid.Columns>
            <DataGridCheckBoxColumn MinWidth="40" Binding="{Binding Path=Selected, UpdateSourceTrigger=PropertyChanged}" />

然后,在可观察集合中,在 setter 上,计算值。

【讨论】:

  • 一个的答案会明确提到这个问题,即缺少UpdateSourceTrigger。你的回答没有做到这一点。相反,它显示了很多不必要的 XAML。您应该删除它并接受其他答案之一。请参阅here 它是如何工作的。
【解决方案2】:

您必须设置 UpdateSourceTrigger=PropertyChanged 才能立即更新绑定:

<DataGridCheckBoxColumn 
    Binding="{Binding Path=Selected, UpdateSourceTrigger=PropertyChanged}"/>

【讨论】:

    【解决方案3】:

    对于 WPF,您这样做是错误的。与其查看 UI 控件,不如查看数据。您说您将Checkbox 控件绑定到ObservableCollection 的属性...我猜您的意思是ObservableCollection 中的对象的属性inside 而不是集合自己。

    因此,在您的视图模型或后面的代码中,当绑定到Checkbox 控件的属性更改时更新您的总值。这样,它每次都会有更新的值。

    【讨论】:

    • 在问题的 XAML 中查看 Binding="{Binding Path=Selected}"。 OP 写道“绑定到 observ.col 中的一个属性。”。
    • 我试过这个,它几乎可以工作。选择值不会在我选中/取消选中复选框时更新,而是在我更改复选框值后在网格中选择另一条记录时更新。有没有办法强制更新立即发生?
    • 我不能 100% 确定 DataGrids,但您可以尝试将 UpdateSourceTrigger=PropertyChanged 添加到 DataGridCheckBoxColumn 的绑定中。
    • 我的意思是你的“我猜你的意思是 ObservableCollection 内的对象的属性而不是集合本身”,这显然是 Selected 属性。因此,您可以在答案中直接引用该属性。
    • 这确实解决了问题:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    相关资源
    最近更新 更多