セットアップ
- カスタムタイプ (「前のドキュメント」) のリストを保持し、それらにバインドする DataGrid があります。その部分は正しく機能します。
SelectedItemProperty
ViewModel のプロパティにデータグリッドをバインドしました。CurrentlySelectedPreviousDocument
- というコマンドにバインドされたデータグリッドの左クリック アクションがあります。
OpenPreviousDocumentCommand
OpenPreviousDocumentCommand
と呼ばれるメソッドを実行しますOpenSelectedPreviousDocument()
OpenSelectedPreviousDocument()
プロパティを使用してCurrentlySelectedPreviousDocument
、ファイルを一時ディレクトリにコピーし、開きます。
問題
- このコードは機能しますが、データグリッドの最初の項目をクリックした場合のみです。
- データ グリッド内の他のすべての項目について、CurrentlySelectedPreviousDocument が null として表示されているように見えるため、すべてのプロパティが null です。
問題の説明に役立つその他のシナリオ:
- アプリケーションをロードすると、行が選択されません。
- 任意の時点で最初のアイテムをダブルクリックすると、他のアイテムをクリックしてエラーが表示された後でも、そのアイテムが開きます。
- 2 番目または 3 番目の項目を最初にダブルクリックすると、エラーが発生します。
- 最初のドキュメントをダブルクリックして開き、別の行をシングルクリックして選択されていることを確認し、別の行をダブルクリックしても、エラーが発生します。
- 最初のドキュメントをダブルクリックして開き、問題のある行の 1 つをクリックするとエラーが発生し、最初の行をもう一度クリックしても機能します。
これまでに試したこと:
- bingding モードを TwoWay に更新する
- UpdateSourceTrigger = PropertyChanged の追加
- 出力ウィンドウを確認しました。無効なバインディングは検出されませんでした。
コード
XAML DataGrid バインディング:
<DataGrid
x:Name="PreviousDocumentsDataGrid"
ItemsSource="{Binding PreviousDocumentsList}"
SelectedItem="{Binding CurrentlySelectedPreviousDocument, Mode=OneWayToSource}"
SelectionMode="Single"
SelectionUnit="FullRow"
AutoGenerateColumns="False"
IsReadOnly="True"
HorizontalGridLinesBrush="LightGray"
VerticalGridLinesBrush="LightGray"
BorderBrush="Transparent"
Visibility="{Binding PreviousDocumentsFound, Converter={StaticResource BoolToVisConverter}}">
<DataGrid.InputBindings>
<MouseBinding Gesture="LeftDoubleClick" Command="{Binding OpenPreviousDocumentCommand}"/>
</DataGrid.InputBindings>
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
<DataGridTextColumn Header="Reference Type" Binding="{Binding ReferenceType}"/>
<DataGridTextColumn Header="Category ID" Binding="{Binding Category}"/>
<DataGridTextColumn Header="Description" Binding="{Binding Description}"/>
<DataGridTextColumn Header="Document Timestamp" Binding="{Binding Timestamp}"/>
</DataGrid.Columns>
</DataGrid>
CurrentSelectedPreviousDocument の ViewModel 定義:
public VEDocument CurrentlySelectedPreviousDocument
{
get { return _currentlySelectedPreviousDocument; }
set { _currentlySelectedPreviousDocument = value;
OnPropertyChanged("CurrentlySelectedPreviousDocument");} //TODO: Is the on propertychanged actually necessary here?
}
コマンド定義:
public ICommand OpenPreviousDocumentCommand
{
get
{
return _openPreviousDocumentCommand ??
(new CommandHandler(OpenSelectedPreviousDocument, _canExecuteCommands));
}
}
ドキュメントを開く ViewModel のメソッド (viewmodel プロパティを使用)
public void OpenSelectedPreviousDocument()
{
var docToOpen = CurrentlySelectedPreviousDocument;
...etc. etc.
}