我花了好几个小时试图解决下面描述的问题:
我在我的 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 );
}
任何想法可能是我的问题的原因是什么?