创建 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有什么区别。
我有一个 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有什么区别。