我花了好几个小时试图解决下面描述的问题:
我在我的 MVVM WPF 应用程序中定义了一个 DataGrid,精简后的 XAML 代码如下所示:
<DataGrid AutoGenerateColumns="False" Name="dgdSomeDataGrid" SelectedItem="{Binding SelectedSomeItem, Mode=TwoWay}" ItemsSource="{Binding SomeItemCollection}">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Id}" Header="ID" />
<DataGridTextColumn Header="Titel" Binding="{Binding Path=Title}" />
<DataGridTextColumn Header="Status" Binding="{Binding Path=State}" />
</DataGrid.Columns>
</DataGrid>
在我关联的 ViewModel 中,我有一个相应的属性,例如:
public WorkItemForUi SelectedSomeItem
{
get
{
return SomeObject.SelectedSomeItem;
}
set
{
SomeObject.SelectedSomeItem = value;
OnPropertyChanged( "SelectedSomeItem" );
}
}
在我的控制器中,我有以下内容:
private void MainWindowViewModelPropertyChanged( object sender, PropertyChangedEventArgs e )
{
if ( e.PropertyName == "SelectedSomeItem" )
{
UpdateSelectedSomeItem();
}
}
我通常想做的是从 中检索所选项目,DataGrid从外部数据存储(在本例中为 TFS)获取有关该项目的更多信息,并在 TextBox 中显示这些额外信息。
所有这些都已按预期工作,但问题是 MainWindowViewModelPropertyChanged 方法被调用了两次,而不是一次。
可能是这种情况下,该SelectedItem属性被设置为发生两次,但我不太确定,因为我发现的很多信息有点矛盾(有时也不太清楚 Windows 窗体或 WPF 是的意思)。
我已经看到一些建议,其中为 定义了 SelectionChanged 事件处理程序DataGrid并使用了一个IsSelected属性,但据我所知,由于我的数据绑定,这不应该是必需的。
更新 作为 MainWindowController 的一部分,有一个 Initialize 方法引用 MainWindowViewModelPropertyChanged 处理程序。
public void Initialize( string tfsProjectCollection )
{
InitializeCommands();
InitializeViewModel();
AddWeakEventListener( m_MainWindowViewModel, MainWindowViewModelPropertyChanged );
}
任何想法可能是我的问题的原因是什么?