MVVM WPF DataGrid通过绑定在PropertyChanged上激发SelectedItem两次
我花了好几个小时试图解决下面描述的问题: 我在MVVM WPF应用程序中定义了一个DataGrid,精简的XAML代码如下所示: 在关联的ViewModel中,我有一个相应的属性,如: UI所选SomeItem的公共工作项 { 收到 { 返回SomeObject.SelectedSomeItem; } 设置 { SomeObject.SelectedSomeItem=值; OnPropertyChanged SelectedSomeItem; } } 在我的控制器中,我有以下功能: private void MainWindowViewModelPropertyChanged对象发送器,PropertyChangedEventArgs e { 如果e.PropertyName==SelectedSomeItem { 更新所选的某些项目; } } 我通常想做的是从DataGrid中检索所选项,从外部数据存储中获取关于该项的更多信息(在本例中为TFS),并在文本框中显示这些额外信息 所有这些都已按预期工作,但问题是调用MainWindowViewModelPropertyChanged方法两次,而不是一次 可能是设计将SelectedItem属性设置为两次,但我不太确定,因为我发现的许多信息有点矛盾,有时也不太清楚Windows窗体或WPF的含义 我看到了一些建议,其中为DataGrid定义了SelectionChanged事件处理程序,并使用了IsSelected属性,但据我所知,由于我的数据绑定,这应该是不必要的 更新 作为MainWindowController的一部分,有一个Initialize方法引用MainWindowViewModelPropertyChanged处理程序 公共void初始化字符串tfsProjectCollection { 初始化命令; 初始化eviewModel; 添加弱EventListener m_MainWindowViewModel,MainWindowViewModel属性已更改; } 知道我的问题的原因吗?您的SomeObject.SelectedSomeItem设置程序是否也会在PropertyChanged SelectedSomeItem;上引发问题;?SomeObject的类型是什么?为什么SomeObject还需要SelectedSomeItem属性 还请在订阅MainWindowViewModelPropertyChanged的地方发布一些代码 我从未对selecteditem行为有过问题,但为了公平起见,我不需要订阅INotifyPropertyChanged来获取此信息。我想你也不需要。有更好的方式在viewmodels之间进行通信 编辑:这是可行的,但我不知道你的代码中有什么东西MVVM WPF DataGrid通过绑定在PropertyChanged上激发SelectedItem两次,wpf,binding,mvvm,datagrid,selecteditem,Wpf,Binding,Mvvm,Datagrid,Selecteditem,我花了好几个小时试图解决下面描述的问题: 我在MVVM WPF应用程序中定义了一个DataGrid,精简的XAML代码如下所示: 在关联的ViewModel中,我有一个相应的属性,如: UI所选SomeItem的公共工作项 { 收到 { 返回SomeObject.SelectedSomeItem; } 设置 { SomeObject.SelectedSomeItem=值; OnPropertyChanged SelectedSomeItem; } } 在我的控制器中,我有以下功能: privat
private WorkItemForUi _selected;
public WorkItemForUi SelectedSomeItem
{
get
{
return this._selectedSomeItem;
}
set
{
this._selectedSomeItem = value;
OnPropertyChanged( "SelectedSomeItem" );
}
}
好的,在花了更多的时间之后,我们发现问题出在ApplicationController类中 构造函数调用该类中的Initialize方法,同一类中的Run方法也调用此方法 在Initialize方法中,调用了主窗口的视图模型“Initialize”方法,其中添加了一个事件侦听器:
[...]
AddWeakEventListener( m_MainWindowViewModel, MainWindowViewModelPropertyChanged );
[...]
从ApplicationController类的构造函数中删除对Initialize方法的调用解决了问题。MainWindowViewModelPropertyChanged每次在ViewModel中用于INotifyPropertyChanged实现的任何属性发生更改时都会被调用。是e.PropertyName==两个调用中的SelectedSomeItem,还是e.PropertyName具有不同的值?在UpdateSelectedSomeItem之后是否尝试过e.Handle=true;如果由于某种原因同一事件发生了两次?@JensH:两个SelectedSomeItem的情况相同。@Scroog1:在主窗口ViewModelPropertyChanged方法e的类型为PropertyChangedEventArgs,没有处理过的属性…?SelectedSomeItem.set是否也调用了两次?如果SomeObject.SelectedSomeItem!=值{…},因为这是INotifyPropertyChanged的典型模式?SomeObject是一个手工制作的对象,包含在UI上显示所需的属性。也许我走错了方向,但我需要一个数据网格的项集合和集合中其他项类型的项,该集合绑定为SelectedItem。对于此SelectedItem,我检索了我不想提前检索的附加数据,这些数据是我集合中绑定到DataGrid的所有项的数据。