以下に説明する問題を解決するために、かなりの時間を費やしました。
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 メソッドが 1 回ではなく 2 回呼び出されることです。
プロパティが 2 回設定されるように設計されている可能性がありSelectedItem
ますが、私が見つけた多くの情報が少し矛盾しているため、よくわかりません (また、Windows フォームまたは WPF のどちらが正しいかはっきりしない場合もあります)。意味)。
SelectionChanged イベント ハンドラーが に対して定義されDataGrid
、IsSelected
プロパティが使用されているという提案をいくつか見てきましたが、私の知る限り、データ バインディングのためにこれは必要ないはずです。
Update MainWindowController の一部として、MainWindowViewModelPropertyChanged ハンドラーを参照する Initialize メソッドがあります。
public void Initialize( string tfsProjectCollection )
{
InitializeCommands();
InitializeViewModel();
AddWeakEventListener( m_MainWindowViewModel, MainWindowViewModelPropertyChanged );
}
私の問題の原因は何ですか?