设置
- 我有一个包含自定义类型列表(“以前的文档”)并绑定到它们的 DataGrid。那部分工作正常。
- 我已将
SelectedItemProperty
datagrid 绑定到我的 ViewModel 上的一个名为CurrentlySelectedPreviousDocument
- 我将数据网格的左键单击操作绑定到一个名为的命令
OpenPreviousDocumentCommand
OpenPreviousDocumentCommand
运行一个名为的方法OpenSelectedPreviousDocument()
OpenSelectedPreviousDocument()
使用该CurrentlySelectedPreviousDocument
属性将文件复制到临时目录并打开它。
问题
- 此代码有效,但前提是您单击数据网格中的第一项。
- 对于数据网格中的每个其他项目,CurrentSelectedPreviousDocument 似乎都显示为空,因此所有属性都为空。
更多场景来帮助描述问题:
- 当我加载应用程序时,没有选择任何行。
- 如果我在任何时候双击第一个项目,它就会打开,即使在单击其他项目并看到错误之后也是如此。
- 如果我先双击第二个或第三个项目,我会收到错误消息。
- 如果我双击第一个文档打开它,然后单击另一行以确保它被选中,然后双击另一行,我仍然收到错误。
- 如果我双击第一个文档将其打开,然后单击其中一个错误行并收到错误消息,然后再次单击第一行,它仍然有效。
到目前为止我尝试过的事情:
- 将绑定模式更新为 TwoWay
- 添加 UpdateSourceTrigger = PropertyChanged
- 检查输出窗口;未检测到无效绑定。
编码
XAML 数据网格绑定:
<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.
}