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