2016-11-28 1 views
0

LogFile에서 읽은 정보를 표시하려면 DataGrid을 만들고 싶습니다. DataGrid은 발생한 오류를 표시합니다 (LogFiles). 그것들을 읽고 각 오류에 대해 객체를 만드는 것은 문제가되지 않습니다.C# wpf mvvm DataGrid 경로의 하이퍼 링크

이제 DataGridLogFile 경로를 추가하고 클릭 할 수있게해야합니다. 따라서 경로를 클릭하면 LogFile이 열립니다. 나는 mvvm 패턴을 사용하므로 코드 숨김 코드는 허용되지 않습니다.

나는 내 문제에 대한 두 가지 아이디어를 발견하지만, 그들 중 누구도 그것을 해결하지 :

<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 사용하여 두 번째 :

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

먼저 하나를

두 경우 모두 Command 또는 Handler는 지정된 경로의 파일 만 열 수 있습니다.

난 당신이 같은 명령 - 바인딩해야 할 당신이 내 문제가 많은 덕분에 어떤 도움을 내가 첫 번째 접근 방법 :

+0

하십시오 UserControl와하지에 Window 변화를 그 안에 위치? – Clemens

+0

MVVM은 마크 업/GUI에서 비즈니스 로직을 제거하는 패턴입니다. – FakeCaleb

+0

내 상사가 코드 숨김 코드를 작성하지 말라고 말했습니다. 생성자 만 허용됩니다. – Max

답변

0

를 얻을 수 있습니다 이해를 바랍니다 : 경우

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

당신의 DataGrid입니다 , 당신이 어디를 읽었다 "코드 숨김 허용에서 MVVM 패턴을 사용하여, 그래서 아무 코드"

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

왜 내가 이 RealtiveSource가 필요하며 어떻게 작동합니까? – Max

+0

'RelativeSource'를 사용하면'Command'에서 DataContext를 찾을 곳을 알 수 있습니다. 이 솔루션이 효과가 있는지 확인하십시오. – Tomtom

+0

나는 그것을 가지고 있지만 이렇게하고있다 : 'Command = "{Binding Path = Data.CmdLogFilePathClick, Source = {StaticResource DataContextProxy}" " – Max