2016-11-28 144 views
0

我想创建一个DataGrid来显示我从LogFile读取的信息。 DataGrid显示发生在LogFiles中的错误。读取它们并为每个错误创建对象是没有问题的。c#wpf mvvm DataGrid超链接到路径

现在我需要将LogFile路径添加到DataGrid并使其可点击。所以当你点击路径LogFile应该打开。我使用mvvm模式,所以在代码隐藏中不允许使用代码。

我发现了2个不同的想法,我的问题,但他们没有解决它:

首先一个与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> 

,并使用第二个的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> 

在这两种情况下,我的命令或处理程序只会在给定的路径下打开文件。

我希望你明白我的问题,非常感谢所有帮助我能:)

+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 =“{Binding Path = Data.CmdLogFilePathClick,Source = {StaticResource DataContextProxy}}”' – Max