繁体   English   中英

c#wpf mvvm DataGrid超链接到路径

[英]c# wpf mvvm DataGrid Hyperlink to Path

我想创建一个DataGrid来显示我从LogFile读取的信息。 DataGrid显示在LogFiles发现的发生的错误。 读取它们并为每个错误创建对象都没有问题。

现在,我需要将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>

在这两种情况下,我的Command或Handler都只在给定路径下打开文件。

希望您能理解我的问题,也非常感谢您能提供的任何帮助:)

在第一种方法中,您必须像这样执行Command-Binding:

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

如果您的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