创建 WPF DataGridHyperlinkColumn 并将其值作为参数传递给自定义 WPF window

Create a WPF DataGridHyperlinkColumn and pass as a parameter its value to a custom WPF window

我有一个 WPF MVVM 应用程序,它的主要形式有一个数据网格视图。 这个数据网格有一些列。其中之一是 DataGridHyperlinkColumn.

类型

在下面的示例中,我将简化实际案例以专注于对我来说很重要的有趣部分,因此在这里我举了一个示例,其中的数据网格只有一个 DataGridHyperlinkColumn 类型的列。我的模型也在这里被简化了。

<Window x:Class="DataGridExample.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit" 
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <my:DataGrid x:Name="MyDataGrid" 
              ItemsSource="{Binding Path=MyListOfItems}"               
              AutoGenerateColumns="False">
        <my:DataGrid.Columns>
           <my:DataGridHyperlinkColumn Header="LinkColumn" 
               Binding="{Binding myExtraData.LinkName}" 
               ContentBinding="{Binding myExtraData.LinkValue}">
               <my:DataGridHyperlinkColumn.ElementStyle>
                 <Style TargetType="TextBlock">
                    <EventSetter Event="Hyperlink.Click" Handler="OnCellHyperlinkClick" />
                 </Style>
               </my:DataGridHyperlinkColumn.ElementStyle>
           </my:DataGridHyperlinkColumn>
        </my:DataGrid.Columns>
    </my:DataGrid>
</Grid>

MyListOfItems 在我的视图模型中是一个 public 属性,其中 gets/sets 项目列表:

List<MyDataModel> myListOfItems

型号: 我的模型包含一个嵌套的 class MyExtraData.

public class MyDataModel 
{
   public MyExtraData myExtraData{ get; set; }

   public MyDataModel()
   {
      myExtraData= new MyExtraData("Click here!", "Hi! How are you?");
   }
}


public class MyExtraData
{
        private string linkName= string.Empty;
        private string linkValue= string.Empty;

        public string LinkName 
        {
            get
            {
                return this.linkName;
            }

            private set
            {
                if (!this.linkName.Equals(value))
                {
                    this.linkName= value;
                }
            }
        }

        public string LinkValue
        {
            get
            {
                return this.linkValue;
            }

            private set
            {
                if (!this.linkValue.Equals(value))
                {
                    this.linkValue = value;
                }
            }
        }

        public MyExtraData(string linkName, string linkValue)
        {
            this.LinkName = linkName;
            this.LinkValue = linkValue;
        }
}

最后在视图代码后面,这里是处理程序:

    private void OnCellHyperlinkClick(object sender, RoutedEventArgs e)
    {
        var rowData = ((Hyperlink)e.OriginalSource).DataContext as MyExtraData;           
    }

我的问题出在 OnCellHyperlinkClick 事件中。当我转换为 MyExtraData 时,rowData 包含一个空值。从这个事件中我想获取 link 的值,即 contentBinding,然后打开一个自定义 window 并将这个值传递给它,我的意思是,我想传递值"Hi! How are you?" 我的习惯 window.

请注意,对于此示例,所有列的单元格都具有相同的名称和 link 的值。在我的真实案例中,所有列的单元格都具有相同的 link 名称,例如 "Click here!",但它的值不同。

问题是我正在转换为与 DataContext 类型不匹配的对象。这里有两种解决方案:

private void OnCellHyperlinkClick(object sender, RoutedEventArgs e)
{
    string linkValue =((MyDataModel)((TextBlock)sender).DataContext).myExtraData.LinkValue;

    // pass linkvalue to my custom WPF window
}

或:

private void OnCellHyperlinkClick(object sender, RoutedEventArgs e)
{    
    MyExtraData myExtraData = (((Hyperlink)e.OriginalSource).DataContext as MyDataModel).myExtraData

    string linkValue = myExtraData.LinkValue;

    // pass linkvalue to my custom WPF window
}

基本上是一样的,我看不出使用sender和e.OriginalSource有什么区别。