WPF DataGrid根据更改

时间:2017-01-02 05:10:26

标签: wpf datagrid f#

对于我正在处理的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

我的理论是set的{​​{1}}方法没有被调用。我尝试通过添加MessageBox对话框来测试这一点,每次将行self.Rows添加到每个Binding时弹出,但这并没有改变结果。我不确定这意味着什么,因为结果肯定会改变,但是这种方法似乎没有被调用。知道什么是错的吗?

1 个答案:

答案 0 :(得分:3)

您正在创建一个包含对Hour的同一实例的24个引用的数组。不是Hour的24个不同实例,而只是一个实例,有24个引用它。因此,当用户选中一个复选框时,所有24行都会检查它,因为它们都绑定到同一个对象,这并不奇怪。

要创建24个Hour的单独实例,请使用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