简体   繁体   English

c#wpf mvvm DataGrid超链接到路径

[英]c# wpf mvvm DataGrid Hyperlink to Path

I want to create a DataGrid to show informations I read from a LogFile . 我想创建一个DataGrid来显示我从LogFile读取的信息。 The DataGrid displays the occured errors, found in LogFiles . DataGrid显示在LogFiles发现的发生的错误。 Reading them and creating Objects for each error is no problem. 读取它们并为每个错误创建对象都没有问题。

Now I need to add the LogFile path to the DataGrid and make it clickable. 现在,我需要将LogFile路径添加到DataGrid并使其可单击。 So when you click on the path the LogFile should open. 因此,当您单击路径时, LogFile应该打开。 Im using mvvm pattern, so no code in code-behind allowed. 我正在使用mvvm模式,因此不允许在代码隐藏中使用任何代码。

I found 2 different ideas to my problem but none of them solved it: 我发现了2个不同的想法来解决我的问题,但没有一个能解决它:

First one with an TemplateColumn : 第一个带有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>

and the second one using an HyperlinkColumn : 第二个使用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>

In both cases my Command or Handler does only open the file at the given path. 在这两种情况下,我的Command或Handler都只在给定路径下打开文件。

I hope you understand my problem and many thanks for any help I can get :) 希望您能理解我的问题,也非常感谢您能提供的任何帮助:)

In your first approach you have to do the Command-Binding like: 在第一种方法中,您必须像这样执行Command-Binding:

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

If your DataGrid is located in a UserControl and not a Window change it to: 如果您的DataGrid位于UserControl而不是Window请将其更改为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM