WPF数据绑定setter循环?

时间:2013-12-10 10:35:27

标签: .net wpf data-binding infinite-loop

背景

我有一个包含ParentViewModel项的ListBox:

<listBox x:Name="lstParentItems"
         ItemsSource="{Binding ParentItems}"
         SelectedItem={Binding SelectedParent, Mode=OneWayToSource}">
</ListBox>

每个父实例都有一个子项列表:ObservableCollection<ChildViewModel> ChildItems。当我选择父项时,我在另一个列表框中显示子项列表:

<!-- displays a list of ChildViewModels for currently selected ParentViewModel -->
<ListBox x:Name="lstChildItems" DataContext={Binding SelectedParent}"
         ItemsSource="{Binding ChildItems}"
         SelectedItem="{Binding SelectedChild, Mode=OneWayToSource}"
         SelectionChanged="lstChildItems_SelectionChanged"
         MouseDoubleClick="lstChildItems_MouseDoubleClick">
</ListBox>

如您所见,我希望Parent实例知道当前选择了哪个Child。

问题

在调试不同的bug时,我发现了一种奇怪的行为,某种 setter loop 。我将一个调试断点放到SelectedChild setter中,如下所示:

public ChildViewModel SelectedChild {
    get { return _selectedChild; }
    set {
        _selectedChild = value;
        RaisePropertyChanged("SelectedChild");
    }
}

当我选择子项时,setter不会调用一次,而是一遍又一遍地执行。调试器在断点处保持暂停(RaisePropertyChanged行)并在单击Continue后立即暂停在同一个地方再次。

我不知道这种行为会从哪里来。任何想法从哪里开始寻找? 我很乐意提供任何必要的细节。到目前为止,我应该提到:

  • SelectedChild属性不参与任何其他绑定(XAML或代码)
  • SelectedChild 从未分配给代码
  • {li>在ChildViewModel我有一个CanCommandExecute方法,用于检查SelectedChild != null
  • lstChildItems中的代码隐藏事件处理程序用于与难以直接合并到我的MVVM体系结构中的COM控件进行交互;他们所做的就是阅读有关SelectedChild的一些信息,如果它不为空;没有分配

1 个答案:

答案 0 :(得分:1)

你的一个要点就是答案:

•在ChildViewModel中,我有一个CanCommandExecute方法,用于检查SelectedChild!= null

它只不过是重复调用CanCommandExecute属性的SelectedChild方法。它会在每次UI获得或失去焦点时调用它,包括每次按F5继续。

当我的应用程序运行时,我实际上使用此方法在我需要的时候执行我的视图模型...只需在我CanExecute的{​​{1}}部分放置一个断点然后去回到用户界面,断点立即被击中......非常有用......一旦你知道发生了什么。