2016-11-28 5 views
0

Ich möchte einen DataGrid erstellen, um Informationen anzuzeigen, die ich von einem LogFile gelesen habe. Das DataGrid zeigt die aufgetretenen Fehler an, die in LogFiles gefunden werden. Das Lesen und Erstellen von Objekten für jeden Fehler ist kein Problem.C# wpf mvvm DataGrid Hyperlink zum Pfad

Jetzt muss ich den LogFile Pfad zum DataGrid hinzufügen und es klickbar machen. Wenn Sie also auf den Pfad klicken, sollte die LogFile öffnen. Ich verwende mvvm Muster, also kein Code in Code-behind erlaubt.

fand ich 2 verschiedene Ideen zu meinem Problem, aber keiner von ihnen es gelöst:

erste mit einem TemplateColumn:

<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> 

und die zweite eine HyperlinkColumn mit:

<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> 

In beiden Fällen öffnet mein Befehl oder Handler nur die Datei auf dem angegebenen Pfad.

Ich hoffe, dass Sie mein Problem und vielen Dank für jede Hilfe verstehe ich :)

+0

"mvvm Muster verwendet, so dass kein Code in Code-Behind erlaubt", wo hast du das gelesen? – Clemens

+0

MVVM ist ein Muster, das die Geschäftslogik aus dem Markup/GUI entfernt – FakeCaleb

+0

Nun mein Chef sagte mir, Code in Code-Behind nicht zu schreiben. Nur Konstruktor erlaubt. – Max

Antwort

0

In Ihrem ersten Ansatz erhalten Sie die Befehls Bindung wie zu tun haben:

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

Wenn Ihr DataGrid ist befindet sich in einem UserControl und kein Window Änderung es zu:

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

Warum mache ich Brauchen Sie diese RealtiveSource und wie funktioniert es? – Max

+0

Mit der 'RelativeSource' können Sie Ihrem' Command' sagen, wo er seinen DataContext suchen soll. Überprüfen Sie, ob diese Lösung für Sie funktioniert. – Tomtom

+0

Ich habe es funktioniert, aber wie folgt aus: 'Command = "{Binding Path = Data.CmdLogFilePathClick, Source = {Static DataContextProxy}}"' – Max

Verwandte Themen