Xaml和DataGrid以及数据绑定问题

时间:2015-01-21 21:56:16

标签: wpf xaml

给定具有公共可写属性SelectedItem和SelectedIndex的视图模型,能够执行以下操作会很好:

<DataGrid SelectedItem="{Binding SelectedItem}" ...

然后,视图模型很容易知道当前选择的项目。不幸的是,这不起作用(通知在启动时发生一次)。为什么呢?

以下内容始终如一地通知视图模型

<DataGrid SelectedIndex="{Binding SelectedIndex}" ...

不幸的是,“index”值实际上相对于过滤和排序的ICollectView,它包装了底层集合(Why)。 ICollectionView没有索引属性,我最初尝试访问它时直接触发了堆栈溢出(没有双关语)。

我怀疑当前Xaml实现中存在这些“陷阱”的充分理由。甚至可能是因为我使用的是F#/ Xaml模板。

1 个答案:

答案 0 :(得分:0)

行。问题结果证明是一个类型问题。本质上,我在视图模型中定义了一个由WPF作为对象使用的选项属性。虽然WPF正在适应这种翻译,但似乎忽略了返回F#的事件通知,尽管它在启动时发生。

当我一丝不苟地确保暴露的属性确实是F#视图模型中的对象时,问题得到了解决。

  member x.SelectedMember         
    with get() = 
      match selectedMember with
      | Some m -> m :> obj
      | _ -> null
    and set (v:obj) =
      selectedMember <- 
        match v with
        | :? MemberVM as m -> Some m
        | _ -> None
      x.OnPropertyChanged "SelectedMember"

正确的代码比我原来的错误代码版本更冗长。如果我有更多这样的翻译,也许我会写一对通用选项&lt; - &gt;对象图......