给定具有公共可写属性SelectedItem和SelectedIndex的视图模型,能够执行以下操作会很好:
<DataGrid SelectedItem="{Binding SelectedItem}" ...
然后,视图模型很容易知道当前选择的项目。不幸的是,这不起作用(通知在启动时发生一次)。为什么呢?
以下内容始终如一地通知视图模型
<DataGrid SelectedIndex="{Binding SelectedIndex}" ...
不幸的是,“index”值实际上相对于过滤和排序的ICollectView,它包装了底层集合(Why)。 ICollectionView没有索引属性,我最初尝试访问它时直接触发了堆栈溢出(没有双关语)。
我怀疑当前Xaml实现中存在这些“陷阱”的充分理由。甚至可能是因为我使用的是F#/ Xaml模板。
答案 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;对象图......