c#wpf mvvm DataGrid超链接到路径
问题描述:
我想创建一个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>
在这两种情况下,我的命令或处理程序只会在给定的路径下打开文件。
我希望你明白我的问题,非常感谢所有帮助我能:)
答
在你的第一个方法,你必须做的命令绑定,如:
Command="{Binding DataContext.CmdLogFilePathClick, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"
如果您DataGrid
是位于UserControl
,而不是它Window
变化:
Command="{Binding DataContext.CmdLogFilePathClick, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
“使用MVVM模式,所以没有代码代码隐藏允许”,你在哪里读的? – Clemens
MVVM是一种从标记/ GUI中删除业务逻辑的模式 – FakeCaleb
我的老板告诉我不要在代码隐藏中编写代码。 只允许构造函数。 – Max