2016-11-28 16 views
0

私はLogFileからの情報を表示するためにDataGridを作成します。 DataGridには、発生したエラーが表示されます(LogFiles)。それらを読んで、エラーごとにオブジェクトを作成することは問題ありません。c#wpf mvvm DataGridパスへのハイパーリンク

DataGridLogFileパスを追加してクリック可能にする必要があります。したがって、パスをクリックするとLogFileが開きます。 Im mvvmパターンを使用しているので、コードビハインドのコードは許可されていません。

私は私の問題に2さまざまなアイデアを見つけましたが、それらのどれもがそれを解決しません:TemplateColumn

まず1:

<DataGrid HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     Margin="10" 
     ItemsSource="{Binding Path=Errors}" 
     SelectionMode="Single" 
     SelectedItem="{Binding Mode=OneWayToSource, Path=SelectedError}" 
     AutoGenerateColumns="False" 
     IsReadOnly="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[FaultyFileCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=FaultyFile}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[LanguageCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=Language}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[KindCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=Type}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[ErrorCodeCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=ErrorCode}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[SourcePathCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=SourcePath}" Width="Auto"/> 
     <DataGridTemplateColumn Header="{Binding Path=Data.Texts[LogFilePath], Source={StaticResource DataContextProxy}}" Width="Auto"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBlock> 
         <Hyperlink Command="{Binding ElementName=ErrorDataGrid, Path=Data.CmdLogFilePathClick, Source={StaticResource DataContextProxy}}"/> 
         <TextBlock Text="{Binding Path=LogFilePath}"/> 
        </TextBlock> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

HyperlinkColumnを用いて第2の1の:

<DataGrid HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     Margin="10" 
     ItemsSource="{Binding Path=Errors}" 
     SelectionMode="Single" 
     SelectedItem="{Binding Mode=OneWayToSource, Path=SelectedError}" 
     AutoGenerateColumns="False" 
     IsReadOnly="True" 
     Name="ErrorDataGrid"> 

    <DataGrid.Columns> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[FaultyFileCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=FaultyFile}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[LanguageCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=Language}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[KindCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=Type}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[ErrorCodeCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=ErrorCode}" Width="Auto"/> 
     <DataGridTextColumn Header="{Binding Path=Data.Texts[SourcePathCaption], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=SourcePath}" Width="Auto"/> 
     <DataGridHyperlink Header="{Binding Path=Data.Texts[LogFilePath], Source={StaticResource DataContextProxy}}" Binding="{Binding Path=LogFilePath}" Width="Auto"> 
      <DataGridHyperlinkColumn.ElementStyle> 
       <Style> 
        <EventSetter Event="Hyperlink.Click" Handler="{Binding Path=Data.DG_Hyperlink_Click, Source={StaticResource DataContextProxy}}"/> 
       </Style> 
      </DataGridHyperlinkColumn.ElementStyle> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

どちらの場合でも、コマンドまたはハンドラは指定されたパスでファイルを開くだけです。

は、私はあなたのようなコマンドは、バインドしなければならないあなたは私の問題と多くのおかげで任意の助けのために私はあなたの最初のアプローチでは:)

+0

「MVVMパターンを使用して、そう何のコードは、コードビハインド許されない」、どこでそれを読みましたか? – Clemens

+0

MVVMはマークアップ/ GUIからビジネスロジックを削除するパターンです – FakeCaleb

+0

私の上司はコードビハインドでコードを記述しないように指示しました。 コンストラクタのみが許可されています。 – Max

答えて

0

を得ることができます理解してほしい:場合

Command="{Binding DataContext.CmdLogFilePathClick, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}" 

あなたDataGridですUserControlに位置していないとWindow変更、それを:

Command="{Binding DataContext.CmdLogFilePathClick, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" 
+0

なぜ私はこのRealtiveSourceが必要です。どのように動作しますか? – Max

+0

'RelativeSource'を使うと、' Command'にDataContextをどこで検索すべきかを伝えることができます。このソリューションがあなたに適しているかどうかを確認してください。 – Tomtom

+0

私はそれが働いているが、このように: 'Command =" {バインディングパス= Data.CmdLogFilePathClick、ソース= {StaticResource DataContextProxy}} "' – Max