WPF MVVM中创建DataGridHyperlinkColumn并传参至自定义窗口
WPF MVVM场景:带DataGridHyperlinkColumn的DataGrid简化实现
我最近在开发一个WPF MVVM应用,主窗体里的DataGrid包含若干列,其中一列是DataGridHyperlinkColumn类型。为了聚焦核心需求,我特意简化了实际场景——下面只展示包含单个DataGridHyperlinkColumn的DataGrid示例,对应的模型和视图模型也做了精简处理。
主窗体XAML代码
<Window x:Class="DataGridExample.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DataGridExample" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Grid> <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- 核心的DataGridHyperlinkColumn配置 --> <DataGridHyperlinkColumn Header="跳转链接" Binding="{Binding LinkUri}" ContentBinding="{Binding LinkDisplayText}"> <DataGridHyperlinkColumn.ElementStyle> <Style TargetType="TextBlock"> <EventSetter Event="Hyperlink.Click" Handler="Hyperlink_Click"/> </Style> </DataGridHyperlinkColumn.ElementStyle> </DataGridHyperlinkColumn> </DataGrid.Columns> </DataGrid> </Grid> </Window>
简化后的模型类
namespace DataGridExample { public class LinkItem { // 链接显示的文本 public string LinkDisplayText { get; set; } // 链接指向的URI地址 public string LinkUri { get; set; } } }
视图模型(ViewModel)示例
using System.Collections.ObjectModel; using System.ComponentModel; namespace DataGridExample { public class MainWindowViewModel : INotifyPropertyChanged { private ObservableCollection<LinkItem> _items; public ObservableCollection<LinkItem> Items { get => _items; set { _items = value; OnPropertyChanged(nameof(Items)); } } public MainWindowViewModel() { // 初始化测试数据 Items = new ObservableCollection<LinkItem> { new LinkItem { LinkDisplayText = "示例链接1", LinkUri = "https://example.com/1" }, new LinkItem { LinkDisplayText = "示例链接2", LinkUri = "https://example.com/2" } }; } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }
主窗体后台代码(绑定ViewModel)
using System.Diagnostics; using System.Windows; using System.Windows.Documents; namespace DataGridExample { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(); } private void Hyperlink_Click(object sender, RoutedEventArgs e) { // 获取点击的链接地址并打开 var hyperlink = (Hyperlink)e.OriginalSource; if (Uri.TryCreate(hyperlink.NavigateUri.ToString(), UriKind.Absolute, out var uri)) { Process.Start(new ProcessStartInfo(uri.ToString()) { UseShellExecute = true }); } } } }
这里的核心点在于DataGridHyperlinkColumn的两个绑定:Binding对应链接的URI地址,ContentBinding对应显示的文本;如果想完全贴合MVVM规范,也可以把点击事件替换成命令绑定,不过简化场景下用事件处理器会更直观。
内容的提问来源于stack exchange,提问作者Willy
相关产品推荐
相关产品推荐

