对于我正在处理的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时弹出,但这并没有改变结果。我不确定这意味着什么,因为结果肯定会改变,但是这种方法似乎没有被调用。知道什么是错的吗?
答案 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