You can customize the operation area (buttons/menus) by configuring PropertyOperationVisibility and handling CustomPropertyOperationControl or CustomPropertyOperationMenuOpening events.
Important: When modifying properties within these events, always use the Factory provided in the PropertyCellContext (e.g., e.Context.Factory!.SetPropertyValue(...)). This ensures changes are integrated into the framework's command pattern for undo/redo support.
private void OnCustomPropertyOperationMenuOpening(object? sender, CustomPropertyDefaultOperationEventArgs e)
{
if (e.Context.Property.Name == nameof(TestExtendsObject.CustomOperationMenuNumber))
{
e.Menu.Items.Clear();
var minMenuItem = new MenuItem { Header = "Min" };
minMenuItem.Click += (s, args) =>
{
// Use the factory to ensure command pattern integration
e.Context.Factory!.SetPropertyValue(e.Context, 0);
};
e.Menu.Items.Add(minMenuItem);
}
}
private void OnCustomPropertyOperationMenuOpening(object? sender, CustomPropertyDefaultOperationEventArgs e)
{
if (!e.Context.Property.IsDefined<PropertyOperationVisibilityAttribute>())
{
return;
}
if (e.Context.Property.Name == nameof(TestExtendsObject.CustomOperationMenuNumber))
{
if (e.StageType == PropertyDefaultOperationStageType.Init)
{
e.DefaultButton.SetLocalizeBinding(Button.ContentProperty, "Operation");
}
else if (e.StageType == PropertyDefaultOperationStageType.MenuOpening)
{
// If you don't want to create the menu every time, you can move it to Init, so you don't have to Clear it here.
e.Menu.Items.Clear();
var minMenuItem = new MenuItem();
minMenuItem.SetLocalizeBinding(HeaderedSelectingItemsControl.HeaderProperty, "Min");
minMenuItem.Click += (s, args) =>
{
e.Context.Factory!.SetPropertyValue(e.Context, 0);
};
var maxMenuItem = new MenuItem();
maxMenuItem.SetLocalizeBinding(HeaderedSelectingItemsControl.HeaderProperty, "Max");
maxMenuItem.Click += (s, args) =>
{
e.Context.Factory!.SetPropertyValue(e.Context, 1024);
};
var errorMenuItem = new MenuItem();
errorMenuItem.SetLocalizeBinding(HeaderedSelectingItemsControl.HeaderProperty, "GenError");
errorMenuItem.Click += (s, args) =>
{
e.Context.Factory!.SetPropertyValue(e.Context, 1024000);
};
e.Menu.Items.Add(minMenuItem);
e.Menu.Items.Add(maxMenuItem);
e.Menu.Items.Add(errorMenuItem);
}
}
}