1

Silverlight DataGrid では、ユーザーが列ヘッダーの 1 つまたは列ヘッダー行の他の場所を右クリックしたときに、コンテキスト メニューを表示したいと考えています。どうすればいいですか?

4

1 に答える 1

1

これを行う動作は次のとおりです。

public class ColumnHeaderContextMenu : Behavior<DataGrid>
{
    public static readonly DependencyProperty ContextMenuProperty =
        DependencyProperty.Register("ContextMenu", typeof (ContextMenu), typeof (ColumnHeaderContextMenu), new PropertyMetadata(default(ContextMenu)));

    public ContextMenu ContextMenu
    {
        get { return (ContextMenu) GetValue(ContextMenuProperty); }
        set { SetValue(ContextMenuProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.Loaded += HandleLoaded;
        AssociatedObject.Unloaded += HandleUnloaded;
    }

    private void HandleUnloaded(object sender, RoutedEventArgs e)
    {
        if (ContextMenu != null)
        {
            ContextMenu.Owner = null;
        }
    }

    private void HandleLoaded(object sender, RoutedEventArgs e)
    {
        var columnHeadersPresenter = AssociatedObject.GetVisualDescendants().OfType<DataGridColumnHeadersPresenter>().FirstOrDefault();

        if (ContextMenu != null)
        {
            ContextMenu.Owner = columnHeadersPresenter;
        }
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.Loaded -= HandleLoaded;
        AssociatedObject.Unloaded -= HandleUnloaded;
    }
}

次のように使用します。

<sdk:DataGrid>
 <i:Interaction.Behaviors>
    <Behaviors:ColumnHeaderContextMenu>
        <Behaviors:ColumnHeaderContextMenu.ContextMenu>
            <Controls:ContextMenu>
                <Controls:MenuItem Header="Choose Columns" Command="{Binding EditColumns}"/>
            </Controls:ContextMenu>
        </Behaviors:ColumnHeaderContextMenu.ContextMenu>
    </Behaviors:ColumnHeaderContextMenu>
 </i:Interaction.Behaviors>
</sdk:DataGrid>
于 2012-05-10T09:40:12.453 に答える