Основным ограничением является то, что вы теряете все мощные функции WPF: Data binding
, ControlTemplates
и DataTemplates
, бесконечный размер, масштабирование / вращение, Opacity
, Attached Properties
, и это лишь некоторые из них. Это много, чтобы сдаться! Вам придется запрограммировать эти элементы управления, используя старые утомительные и подверженные ошибкам методы WinForms, и снова разобраться со всеми теми ограничениями, от которых вы освободились несколько лет назад.
DataGridView
NET Framework 3.5 sp1 имеет DataGrid
, который может выполнять эту работу, и для этого есть несколько сторонних элементов управления, например, из Xceed. Использование сетки на основе WPF обеспечивает полное связывание, создание шаблонов и стилизацию внутри сетки, что было бы невозможно, если вы используете WinForms DataGridView.
PropertyGrid
Причина, по которой WPF не поставляется с PropertyGrid
, заключается в том, что его так легко воссоздать, используя то, что уже дает вам WPF: простой список будет работать в правильном стиле с несколькими строками кода.
Преимущество использования реализации WPF PropertyGrid
заключается в том, что вы можете использовать шаблоны для представления редактируемых свойств, а самое главное вы можете добавлять новые редакторы свойств, просто выражая их в XAML с несколькими привязками. Например, некоторые из свойств в одной из наших сеток свойств устанавливаются с помощью ползунков, и для этого потребовалось всего около пяти строк XAML.
Вот код, иллюстрирующий ключевые концепции реализации PropertyGrid в WPF:
public class PropertyGrid
{
...
public static readonly DependencyProperty SelectedObjectProperty = ...
{
PropertyChangedCallback = (obj, e) =>
{
PropertyItems =
from pi in SelectedObject.GetType().GetProperties()
select new PropertyGridItem { Object = SelectedObject, PropertyInfo = pi };
}
}
}
public class PropertyInfo
{
public object Object;
public PropertyInfo PropertyInfo;
public object Value
{
get { return PropertyInfo.GetValue(Object); }
set { PropertyInfo.SetValue(Object, value); }
}
public string Category
{
get
{
return (
from attrib in PropertyInfo.GetCustomAttributes().OfType<CategoryAttribute>()
select attrib.Name
).FirstOrDefault();
}
}
}
При этом очень быстро и легко можно воспроизвести весь внешний вид PropertyGrid
с помощью нескольких строк XAML: просто используйте ListBox с группировкой по категориям и ItemTemplate
, состоящий из DockPanel
содержит фиксированную ширину TextBlock
, связанную с именем свойства, и ContentPresenter
для печати редактора свойств.