【问题标题】:DataBinding Oddity - Converter not called on the second passDataBinding Oddity - 第二次未调用转换器
【发布时间】:2010-08-18 21:45:37
【问题描述】:

我有一个上下文菜单,它被定义为资源并绑定到 DataGrid 中的 SelectedItem,使用转换器获取当前项目的显示名称,如“编辑”或“编辑”

它适用于第一个选定的项目,但不会在第二个调用转换器(我有一个断点,只有在第一次通过时才会被击中)。但是,如果我在第二遍调用绑定命令,它应该调用新选择的实例。

我将此技术与其他 ItemsControls 一起使用,但我没有发现任何问题。有什么想法吗?

干杯,
浆果

资源和绑定

<ContextMenu x:Key="ProjectActivityContextMenu" x:Shared="true">
    ...
    <MenuItem Header="{Binding SelectedProjectActivity, Converter={StaticResource DeleteProjectConv}}" Command="{Binding DeleteCommand}" />
</ContextMenu>

接线

<DataGrid ...
    SelectedItem="{Binding SelectedProjectActivity}" 
    IsSynchronizedWithCurrentItem="True" 
    ContextMenu="{DynamicResource ProjectActivityContextMenu}"
 >

更新

如果我将其声明为网格的一部分,也会发生这种情况,例如:

<DataGrid.ContextMenu>
    <ContextMenu >
    ....
    <MenuItem Header="{Binding SelectedProjectActivity, Converter={StaticResource DeleteProjectConv}}" Command="{Binding DeleteCommand}" />
                </ContextMenu>
</DataGrid.ContextMenu>

【问题讨论】:

  • 只是检查一下,“SelectedProjectActivity”属性的 PropertyChanged 事件是否被正确引发?另外,DeleteCommand 是什么类型的命令?
  • @puppet。好主意,我没有在 SelectedProject 的设置器中提出我自己的 propertyNotification,因为它是由框架同步的。 At least thats how I understand it and I see the value change when a different item is selected
  • @puppet。该命令是 Josh Smith 的 RelayCommand 的变体,或者他们现在所说的任何东西。我也怀疑 CanExecute 委托(只要 SelecedProject != null 就是如此),但它看起来很好,并且命令在正确的 SelectedProject 上正确执行。也许我需要 UpdateTrigger 设置?我很困惑
  • 如果您想要更新使用它的其他绑定,您仍然需要在 SelectedProjectActivity 上发送 PropertyChanged 通知。我假设您正在谈论的同步是通过设置 IsSynchronizedWithCurrentItem="True" 激活的 ICollectionView.CurrentItem。这对您在此示例中使用的任何内容都没有影响。
  • @约翰。你是对的,在设置上使用 INPC 修复它。干杯

标签: wpf silverlight data-binding


【解决方案1】:

我认为您所看到的只是将 ContextMenu 定义为资源的结果。在您真正打开菜单之前,它没有要应用绑定的 DataContext,因此不会调用转换器。即使您在不打开菜单的情况下更改了几次选择,这也应该成立。右键单击并打开菜单后,将应用 DataContext 并且可以解析绑定。

【讨论】:

  • 感谢您的回复,但是当菜单被声明为网格的一部分时也会发生这种情况,就像我更新帖子的末尾一样。
  • 答案确实是触发属性更改,而不是更改资源的位置。
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多