2010-03-19 2 views
0

문자열 유형의 속성 ("http://something.com")에 바인딩 할 때 아무런 문제가 없습니다. 그러나 나는 예전의 예에서 우리의 재산에 직접적으로 묶는 것을 보았던 것으로 보인다.WPF DataGrid DataGridHyperlinkColumn to Uri

 <dg:DataGridHyperlinkColumn IsReadOnly="True" 
        Header="Uri" Binding="{Binding Path=NavigURI}" /> 

NavigurI는 우리입니다. 최근의 문서는 내가 또한 컨버터를 시도 컨버터

<DataGridHyperlinkColumn Header="Email" Binding="{Binding Email}" ContentBinding="{Binding Email, Converter={StaticResource EmailConverter}}" /> 

을 필요로하는 것,하지만 유무에 관계없이 두 경우 모두 컨버터 열은 비어 있습니다. 디버깅을 통해 "변환"메서드에 전달 된 값이 항상 null임을 보여줍니다. 내 질문 : 어떤 이유로 든 Uri 속성에 바인딩하려는 경우 Codeplex의 최신 DataGrid가 적합할까요?

+0

두 번째 예제에서는 왜 ContentBinding에 바인딩합니까 ?? 왜 바인딩 속성에 변환을 포함시키지 않습니까? –

+0

그것이 내가 msdn에서 본 것입니다. http://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid%28VS.100%29.aspx – MicMit

답변

5

ContentBinding 속성은 실제 URL 이외의 텍스트를 표시하는 데 사용할 수 있습니다. 예를 들어, 내가 ProductUri제품 이름의 실제 URL에 친화적 인 사람이 읽을 수있는 텍스트 데이터에 바인딩하고 있다면, 나는이 작업을 수행 할 수 있습니다은 MSDN 샘플 코드에서

<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의 경우 EmailConverter가 "mailto :"와 그 뒤에 오는 모든 것을 제거하고 mailto 링크의 사용자 이름 부분 만 표시합니다. 그러나 HTML 링크의 href 속성은 변경되지 않습니다. 예를 들어 표시되는 텍스트는 "mjgreen"이지만 핸들러 OnHyperlinkClick은 "mailto : [email protected]"이라는 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(); 
     } 
}