2

设置

  • 我有一个包含自定义类型列表(“以前的文档”)并绑定到它们的 DataGrid。那部分工作正常。
  • 我已将SelectedItemPropertydatagrid 绑定到我的 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.
}
4

1 回答 1

1

调试和发布问题的课程——这完全取决于我。

没有提到但应该提到的是,在离线模式下,我使用了虚假服务来返回文档列表。

如果我提到了这一点,我可以粘贴代码,人们可以看到我的虚假服务没有返回两个文件的位置(因此我的问题)。

我创建了一段调试代码,当我的视图模型打开时,它会从列表本身输出位置。这样做帮助我看到问题出在列表上,而不是绑定上。我认为绑定错误(由于我对 WPF 缺乏经验)的假设实际上是错误的。

非常感谢sexta13meilke帮助我排除了其他潜在问题。

经验教训/强化:

  • 调试时,从源头开始。在流程的每一步挑战您的假设,直到
  • 当使用虚假的任何东西时,标准化它返回值的方法,以便它们都采用相同的格式。我通常会这样做,但没有把它作为捷径,它咬了我一口。
  • 提及并发布与情况相关的代码,即使看起来无关。如果我发布了假货和他们的代码,有人可能会帮助我很快看到这个问题。
于 2013-09-27T15:27:47.290 回答