WPF: Como fazer um DataGridEditor para a PropertyGrid

Em artigos anteriores falamos de Como usar uma PropertyGrid para criar uma interface para as definições e também de DataGrid editável e um ObservableDictionary. Agora vamos fazer uso de ambos os conceitos e criar um DataGridEditor para ser usado na PropertyGrid do Extended WPF Toolkit.

Fazer um DataGridEditor

Há várias formas de criar um editor para uma PropertyGrid. Neste caso vamos implementar a interface ITypeEditor.

public class DataGridEditor : ITypeEditor
{
    public FrameworkElement ResolveEditor(PropertyItem propertyItem)
    {
        var grid = new DataGrid();
        grid.MaxHeight = 400;
  
        var button = new DropDownButton();
        button.Content = "(Collection)";
        button.DropDownContent = grid;
        button.IsTabStop = true;
        button.MinHeight = 22;
        button.SnapsToDevicePixels = true;
        button.Background = Brushes.White;
        button.BorderThickness = new Thickness(0);
        button.Padding = new Thickness(2, 0, 0, 0);
        button.HorizontalAlignment = HorizontalAlignment.Left;
        button.VerticalAlignment = VerticalAlignment.Center;
  
        var _binding = new Binding("Value");
        _binding.Source = propertyItem;
        _binding.ValidatesOnExceptions = true;
        _binding.ValidatesOnDataErrors = true;
        _binding.Mode = propertyItem.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay;
        BindingOperations.SetBinding(button.DropDownContent as DataGrid, DataGrid.ItemsSourceProperty, _binding);
  
        return button;
    }
}

Bastante simples. Apenas criamos uma DataGrid e colocamo-la como o conteúdo de um DropDownButton. Personalizei as propriedades às minhas necessidades.

Definam o editor para a propriedade

Podem especificar o editor usando um atributo na propriedade.

[Category("General settings")]
[DisplayName("Countries")]
[Editor(typeof(DataGridEditor), typeof(DataGridEditor))]
public ObservablePairCollection<string, string> Countries { get; set; }

Resultado final

Usar uma DataGrid numa PropertyGrid:

DataGrid numa PropertyGrid
DataGrid numa PropertyGrid
Nuno Freitas
Publicado por Nuno Freitas em 28 março, 2014

Artigos relacionados