Отображение свойств только для чтения в элементе управления PropertyGrid

Я использую расширенный инструментарий WPF для отображения свойств команда

2 ответов


Я думаю, что лучше всего здесь реализовать свой собственный редактор, согласно Документация Xceed. Затем вы можете предоставить пользователю любой пользовательский интерфейс, который хотите отобразить, без необходимости фиксировать значения обратно в базовый объект. Обратите внимание, что этот подход работает как для частных сеттеров, так и для свойств без каких-либо сеттер.

ReadOnlyCollectionEditor

XAML

<UserControl x:Class="WpfApplication2.ReadOnlyCollectionEditor"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Name="uc">
    <Button Click="Button_OnClick" Height="20" />
</UserControl>

Код

public partial class ReadOnlyCollectionEditor : UserControl, ITypeEditor
{
    public ReadOnlyCollectionEditor()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
        "Value", typeof (IList<string>), typeof (ReadOnlyCollectionEditor), new PropertyMetadata(default(IList<string>)));

    public IList<string> Value
    {
        get { return (IList<string>)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public FrameworkElement ResolveEditor(Xceed.Wpf.Toolkit.PropertyGrid.PropertyItem propertyItem)
    {
        var binding = new Binding("Value")
        {
            Source = propertyItem,
            Mode = propertyItem.IsReadOnly ? BindingMode.OneWay : BindingMode.TwoWay
        };
        BindingOperations.SetBinding(this, ValueProperty, binding);
        return this;
    }

    private void Button_OnClick(object sender, RoutedEventArgs e)
    {
        ReadOnlyCollectionViewer viewer = new ReadOnlyCollectionViewer {DataContext = this};
        viewer.ShowDialog();
    }
}

ReadOnlyCollectionViewer

<Window x:Class="WpfApplication2.ReadOnlyCollectionViewer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ReadOnlyCollectionViewer" Height="300" Width="300">
    <ListBox ItemsSource="{Binding Value}" />
</Window>

Класс Свойств Образца

public class MyDataObjects
{
    public MyDataObjects()
    {
        this.CollectionProperty = new Collection<string> {"Item 1", "Item 2", "Item 3"};            
        this.StringProperty = "Hi!";
    }

    public string StringProperty { get; set; }

    [Editor(typeof(ReadOnlyCollectionEditor), typeof(ReadOnlyCollectionEditor))]
    public ICollection<string> CollectionProperty { get; private set; } 
}   

присвоение имущества сетка

this.propertyGrid.SelectedObject = new MyDataObjects();

результаты

Main Window

enter image description here

редактировать

Я понимаю, что вы хотите использовать MVVM, который я настоятельно рекомендую при использовании WPF, но для целей этого образца я считаю, что сохранение его простым помогает проиллюстрировать точку, иначе он поднимает другие вопросы, такие как отображение модального диалога из MVVM, поэтому я просто показываю диалог нажатием кнопки.


public Collection<Person> People
{
    get { return _people; }
    set { throw new NotSupportedException(); }
}

возможно, не самое приятное решение, но оно будет работать с PropertyGrid, не позволяя пользователям устанавливать новую коллекцию.