【问题标题】:WPF DataGrid updates all rows based on changesWPF DataGrid 根据更改更新所有行
【发布时间】:2017-01-02 05:10:25
【问题描述】:

对于我正在开发的 GUI 应用程序,我需要一个用于编辑时间表的网格。每个时间表都是一个“小时”对象的数组,定义为:

type Hour = { // 24-hour units for every day
    mutable Sunday    : bool
    mutable Monday    : bool
    mutable Tuesday   : bool
    mutable Wednesday : bool
    mutable Thursday  : bool
    mutable Friday    : bool
    mutable Saturday  : bool
}

这些对象排列在以下数据网格中:

<DataGrid x:Name="DataGrid" ItemsSource="{Binding Rows}" AutoGenerateColumns="False">
  <DataGrid.Columns>
    <DataGridCheckBoxColumn Header="Sunday" Binding="{Binding Sunday}"  Width="*" />
    <DataGridCheckBoxColumn Header="Monday" Binding="{Binding Monday}" Width="*" />
    <DataGridCheckBoxColumn Header="Tuesday" Binding="{Binding Tuesday}" Width="*" />
    <DataGridCheckBoxColumn Header="Wednesday" Binding="{Binding Wednesday}" Width="*" />
    <DataGridCheckBoxColumn Header="Thursday" Binding="{Binding Thursday}" Width="*" />
    <DataGridCheckBoxColumn Header="Friday" Binding="{Binding Friday}" Width="*" />
    <DataGridCheckBoxColumn Header="Saturday" Binding="{Binding Saturday}" Width="*" />
  </DataGrid.Columns>
</DataGrid>

每当数据网格中的行发生更改时,都会导致整个列接收相同的更改(刷新数据网格后)。例如,如果我在星期三取消设置 5:00,则整个星期三列将变为未设置。如果我将星期一设置为 8:00,则一旦刷新数据网格,整个星期一都会设置。

F#代码的相关部分:

type SchedulePage (schedule : Hour[]) as self =
  inherit SchedulePageBase () // XAML<"SchedulePage.xaml">
  do self.DataContext <- self

  let mutable schedule = schedule
  member self.Rows with get () = schedule and set value = schedule <- value

我的理论是self.Rowsset 方法没有被调用。我尝试通过在每次将行UpdateSourceTrigger=PropertyChanged 添加到每个绑定时弹出一个 MessageBox 对话框来测试这一点,但这并没有改变结果。我不确定这意味着什么,因为结果肯定会改变,但是这个方法似乎没有被调用。知道有什么问题吗?

【问题讨论】:

  • 您能展示一下您是如何构建SchedulePage 的实例的吗?
  • 当然,我有以下代码: let blankSchedule = Array.create 24 { Sunday = false Monday = false Tuesday = false Wednesday = false Thursday = false Friday = false Saturday = false } 我只是有@ 987654328@ 来构建它,我重用了参考。

标签: wpf datagrid f#


【解决方案1】:

您正在创建一个包含 24 个对 Hour 的同一实例的引用的数组。 Hour 不是 24 个不同的实例,而是只有一个实例,有 24 个对其的引用。因此,当用户选中一个复选框时,所有 24 行都被选中也就不足为奇了,因为它们都绑定到同一个对象。

要创建Hour 的24 个独立实例,请使用Array.init

let blankSchedule = Array.init 24 (fun _ ->  
    { Sunday = false; Monday = false; Tuesday = false 
      Wednesday = false; Thursday = false; Friday = false; Saturday = false })

另外(顺便说一句),在您当前的设置下,您实际上并不需要 SchedulePage.Rows 属性是可写的。从来没有人给它写信。只需将其设为member val

type SchedulePage (schedule : Hour[]) as self =
   inherit SchedulePageBase ()
   do self.DataContext <- self
   member val Rows = schedule

【讨论】:

  • 非常感谢!我从未真正在 F# 中使用可变性,我想我从未考虑过它的语义。
猜你喜欢
  • 2012-04-16
  • 1970-01-01
  • 2014-08-25
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多