[英]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.