Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MVVM WPF DataGrid通过绑定在PropertyChanged上激发SelectedItem两次_Wpf_Binding_Mvvm_Datagrid_Selecteditem - Fatal编程技术网

MVVM WPF DataGrid通过绑定在PropertyChanged上激发SelectedItem两次

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

我花了好几个小时试图解决下面描述的问题:

我在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之间进行通信

编辑:这是可行的,但我不知道你的代码中有什么东西

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的所有项的数据。