You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:59:32