2017-01-02 41 views
1

对于我正在处理的GUI应用程序,我需要一个用于编辑时间表的网格。每个调度是一个“小时”对象的阵列,定义为:WPF DataGrid根据更改更新所有行

<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> 

在任何时间一排在数据网格中改变:

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 
} 

这些目的将在以下数据格奠定了,这会导致整个列接收到相同的更改(一旦数据网格刷新)。例如,如果我在星期三的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方法不会被调用。我试图通过添加一个MessageBox对话框来测试每次绑定时行UpdateSourceTrigger=PropertyChanged,但这并没有改变结果。我不确定这意味着什么,因为结果肯定会改变,但是这种方法似乎没有被调用。任何想法有什么不对?

+1

您可以显示如何构建'SchedulePage'实例吗? –

+0

当然,我有以下代码: 让blankSchedule = Array.create 24 { 星期日=假 周一=假 周二=假 周三=假 周四=假 周五=假 周六=假 } 我只需要'SchedulePage blankSchedule'来构造它,并重新使用该引用。 – NerdicViking

回答

3

您正在创建一个对同一个实例Hour的24个引用的数组。不是24个不同的Hour实例,但只有一个实例,有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 
+1

非常感谢!我从来没有真正在F#中使用可变性,我想我从来没有考虑过它的语义。 – NerdicViking