Отображение свойств только для чтения в элементе управления 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();
результаты
редактировать
Я понимаю, что вы хотите использовать MVVM, который я настоятельно рекомендую при использовании WPF, но для целей этого образца я считаю, что сохранение его простым помогает проиллюстрировать точку, иначе он поднимает другие вопросы, такие как отображение модального диалога из MVVM, поэтому я просто показываю диалог нажатием кнопки.
public Collection<Person> People
{
get { return _people; }
set { throw new NotSupportedException(); }
}
возможно, не самое приятное решение, но оно будет работать с PropertyGrid, не позволяя пользователям устанавливать новую коллекцию.