Файлы конфигурации неизменно медленно двигаются свой путь к становлению ужасными, нелогичными "абсолютными языками программирования". Это берет искусство и навык для разработки хороших языков программирования, и языки конфигурации повернулись, язык программирования имеют тенденцию быть ужасающим.
А хороший подход должен использовать приятно разработанный язык, сказать Python или рубин, и использовать его для создания DSL для конфигурации. Тем путем Ваш язык конфигурации может остаться простым на поверхности, но в на самом деле быть абсолютным языком программирования.
Вы можете использовать лямбда-выражение для выражения имени свойства, а не использовать имя напрямую:
protected static string GetPropertyName<TSource, TResult>(Expression<Func<TSource, TResult>> expression)
{
if (expression.NodeType == ExpressionType.Lambda && expression.Body.NodeType == ExpressionType.MemberAccess)
{
PropertyInfo prop = (expression.Body as MemberExpression).Member as PropertyInfo;
if (prop != null)
{
return prop.Name;
}
}
throw new ArgumentException("expression", "Not a property expression");
}
Вы бы использовали его так:
...
DisplayMember = new Binding(GetPropertyName((MyDataObject o) => o.FooProperty))
...
Хорошо, это немного многословно .. . Если вам нужно что-то более короткое, вы также можете создать вспомогательный метод:
public Binding CreateBinding<TSource, TResult>(Expression<Func<TSource, TResult>> expression)
{
return new Binding(GetPropertyName(expression))
}
...
DisplayMember = CreateBinding((MyDataObject o) => o.FooProperty)
...
Таким образом, рефакторинг должен работать нормально, если вы переименуете свойство (кроме XAML, конечно ...)
Вы можете использовать отражение для определения имен вашей собственности. Конечно, это проблематично, если у вас более одной привязки на класс, поэтому, возможно, дополнительно используйте настраиваемые атрибуты (которые также доступны через отражение), чтобы получить «подсказки» относительно правильного поля привязки, к которому должно быть привязано указанное свойство.
Это вполне может закончиться просто перемещением нерефакторируемой магической строки в другую часть приложения, хотя я не могу сказать, что пробовал это, и это сработало.
Рефакторинг полагается на поддержку инструментальных средств, распознающих, когда конкретный символ в коде (C #, XAML, config и т. Д.) Представляет собой переименованный идентификатор.
В приведенном вами примере строковый литерал «FooProperty»
не может быть на 100% истолкован как принадлежащий MyDataObject
без специальных знаний о внутренней работе GridView
и, как следствие, все остальные типы в WPF и других фреймворках.
Однако в DataTemplate можно быть уверенным на 99%:
<DataTemplate DataType="{x:Type local:MyDataObject}">
<TextBlock Text="{Binding Path=FooProperty}" />
</DataTemplate>
Я использую (и клянусь) плагин IDE под названием ReSharper (он же R #), который очень хорошо разбирается в этих виды вещей. Если вы переименуете FooProperty
, R # переименует свойство автоматически.
В вашем примере, если вы переименуете свойство, R # все равно будет использоваться. Он находит все экземпляры строки в литералах (ваш случай) и комментариях (очень полезно, если вы закомментировали некоторый код и могли бы раскомментировать его позже). Вам предоставляется представление в виде дерева, которое показывает каждый литерал в контексте, и вы можете отмечать / снимать отметки с отдельных использований / файлов / папок / проектов, прежде чем продолжить.
Если ваш бюджет позволяет, получите R #. Если ваш бюджет не позволяет, скачайте пробную версию, и к концу ее хватит.