1

次のコードを含む他のテンプレートを含むテンプレートがあります。

<DataGridHyperlinkColumn Header="Website" Binding="{Binding Website}" 
    IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
<DataGridHyperlinkColumn.ElementStyle>
    <Style TargetType="TextBlock">
        <EventSetter Event="Hyperlink.Click" Handler="OnHyperlinkClick" />
        <Setter Property="Tag" Value="{Binding Website}"/>
    </Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

ただし、テンプレート内にあるため、コードを実行すると例外が発生します。

これに対処する通常の方法は、コマンドを使用することです。

<Hyperlink CommandParameter="{Binding Website.Uri.AbsoluteUri}" Command="{Binding Navigate, ElementName=UserControl}">
<TextBlock Text= "{Binding Website.Uri.AbsoluteUri}" />
</Hyperlink>

私はもう試した:

<DataGridHyperlinkColumn Header="Website" Binding="{Binding Website}" 
        IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
    <DataGridHyperlinkColumn.ElementStyle>
        <Style TargetType="TextBlock">
            <Setter Property="Hyperlink.Command" Value="{Binding Navigate, ElementName=userControl}"/>
            <Setter Property="Hyperlink.CommandParameter" Value="{Binding Website}"/>               
        </Style>
    </DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>

しかし、次のエラーが発生します:

Cannot find source for binding with reference 'ElementName=userControl'. 
BindingExpression:Path=Navigate; DataItem=null; target element is 'TextBlock' 
(Name=''); target property is 'Command' (type 'ICommand')

UserControlは次のように宣言されます。

<UserControl x:Name="userControl" ....

DataGridHyperlinkColumn.ElementStyleイベントハンドラーを設定する代わりにコマンドを設定するようにカスタマイズするにはどうすればよいですか?

アップデート

コマンドコードは次のようになります。

    public class NavigateCommand : ICommand
    {
        #region ICommand Members

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged;

        public void Execute(object parameter)
        {
            Process.Start(parameter.ToString());
        }

        #endregion
    }
4

1 に答える 1

2

あなたの質問への答えではありませんが、おそらく回避策です:列をテンプレート列に変えて、スタイル付きのボタンを表示するには、次の行に沿って何かを行います:

<DataGridTemplateColumn Header="Website" 
        IsReadOnly="True" SortMemberPath="Input.OriginalUri.AbsoluteUri" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
           <Button Content="{Binding Website}" Command="{StaticResource NavigateCommand}" CommandParameter="{Binding Website}" Style={StaticResource LinkStyle}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
于 2012-06-23T21:29:12.750 に答える