我有一个包含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
从未分配给代码ChildViewModel
我有一个CanCommandExecute方法,用于检查SelectedChild != null
lstChildItems
中的代码隐藏事件处理程序用于与难以直接合并到我的MVVM体系结构中的COM控件进行交互;他们所做的就是阅读有关SelectedChild
的一些信息,如果它不为空;没有分配答案 0 :(得分:1)
你的一个要点就是答案:
•在ChildViewModel中,我有一个CanCommandExecute方法,用于检查SelectedChild!= null
它只不过是重复调用CanCommandExecute
属性的SelectedChild
方法。它会在每次UI获得或失去焦点时调用它,包括每次按F5继续。
当我的应用程序运行时,我实际上使用此方法在我需要的时候执行我的视图模型...只需在我CanExecute
的{{1}}部分放置一个断点然后去回到用户界面,断点立即被击中......非常有用......一旦你知道发生了什么。