绑定到字符串类型(“http://something.com”)的属性时没问题。但是,我似乎在旧示例中已经看到直接绑定到Uri属性。
<dg:DataGridHyperlinkColumn IsReadOnly="True"
Header="Uri" Binding="{Binding Path=NavigURI}" />
NavigURI是Uri。最近的文档似乎需要转换器
<DataGridHyperlinkColumn Header="Email" Binding="{Binding Email}" ContentBinding="{Binding Email, Converter={StaticResource EmailConverter}}" />
我也尝试使用转换器,但无论是否有转换器列都是空的。 调试显示传递给“Convert”方法的值始终为null。我的问题:如果出于任何原因我想要绑定到Uri属性,那么来自Codeplex的最新DataGrid是否可行?
答案 0 :(得分:5)
ContentBinding属性可用于显示实际URL以外的文本。例如,如果我使用 ProductName 中友好的,人类可读的文本和 ProductUri 中的实际URL绑定数据,我可能会这样做:
<DataGridHyperlinkColumn Name="productColumn"
Binding="{Binding Path=ProductUri}"
ContentBinding="{Binding Path=ProductName}"
Header="Product"
IsReadOnly="True"
Width="*">
<DataGridHyperlinkColumn.ElementStyle>
<Style TargetType="TextBlock">
<EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick" />
</Style>
</DataGridHyperlinkColumn.ElementStyle>
在DataGrid的MSDN示例代码中,EmailConverter正在删除“mailto:”和@及其后的所有内容,并且只显示mailto链接的用户名部分。但是,底层链接(HTML术语中的href属性)保持不变。因此,例如,可见文本可能是“mjgreen”,但处理程序OnHyperlinkClick将收到“mailto:mjgreen@company.com”的NavigateUri属性。顺便说一下,获取NavigateUri的代码如下所示:
private void OnHyperlinkClick(object sender, RoutedEventArgs e)
{
var destination = ((Hyperlink)e.OriginalSource).NavigateUri;
Trace.WriteLine("Browsing to " + destination);
using (Process browser = new Process())
{
browser.StartInfo = new ProcessStartInfo
{
FileName = destination.ToString(),
UseShellExecute = true,
ErrorDialog = true
};
browser.Start();
}
}