WPF DataGrid DataGridHyperlinkColumn привязан к Uri - PullRequest
0 голосов
/ 19 марта 2010

Нет проблем при привязке к свойству строкового типа ("http://something.com"). Однако в старых примерах я, похоже, видел прямую привязку к свойству Uri.

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

NavigURI - это Ури. Более поздние документы, кажется, требуют конвертера

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

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

1 Ответ

5 голосов
/ 24 мая 2011

Свойство 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: mjgreen@company.com». Код для получения 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();
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...