Silverlight DataGrid では、ユーザーが列ヘッダーの 1 つまたは列ヘッダー行の他の場所を右クリックしたときに、コンテキスト メニューを表示したいと考えています。どうすればいいですか?
質問する
385 次
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 に答える