2010-03-19 2 views
0

Нет проблем при привязке к свойству строкового типа ("http://something.com"). Однако, похоже, я видел в старых примерах прямую привязку к свойству Uri.WPF DataGrid DataGridHyperlinkColumn, связанный с 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}}" /> 

Я попытался с преобразователем также, но в обоих случаях с или без преобразователя столбец пуст. Отладка показала, что значение, переданное методу «Преобразование», всегда равно нулю. Мой вопрос: если по какой-либо причине я хочу привязать к свойству Uri, возможно ли это для последнего DataGrid из Codeplex?

+0

В вашем втором примере почему вы привязываете его к ContentBinding ?? почему бы не включить преобразованное свойство Binding? –

+0

Вот что я увидел в msdn http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid%28VS.100%29.aspx – MicMit

ответ

5

Свойство ContentBinding может использоваться для отображения текста, отличного от фактического URL. Например, если я привязка к данным с дружественным, человеком-читаемый текст в ProductName и фактическим URL в ProductUri, я мог бы сделать это:

<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> 

В примере кода MSDN для DataGrid EmailConverter отключает «mailto:» и @ и все после него и отображает только часть имени пользователя mailto. Однако базовая ссылка, атрибут href в HTML-выражениях, не изменяется. Так, например, видимый текст может быть «mjgreen», но обработчик OnHyperlinkClick получит свойство NavigateUri «mailto: [email protected]». Код для получения 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(); 
     } 
} 
Смежные вопросы