Как я заставляю привязку данных WPF осуществить рефакторинг безопасный?

Файлы конфигурации неизменно медленно двигаются свой путь к становлению ужасными, нелогичными "абсолютными языками программирования". Это берет искусство и навык для разработки хороших языков программирования, и языки конфигурации повернулись, язык программирования имеют тенденцию быть ужасающим.

А хороший подход должен использовать приятно разработанный язык, сказать Python или рубин, и использовать его для создания DSL для конфигурации. Тем путем Ваш язык конфигурации может остаться простым на поверхности, но в на самом деле быть абсолютным языком программирования.

7
задан Brian Gideon 11 September 2009 в 20:42
поделиться

3 ответа

Вы можете использовать лямбда-выражение для выражения имени свойства, а не использовать имя напрямую:

    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, конечно ...)

3
ответ дан 7 December 2019 в 12:23
поделиться

Вы можете использовать отражение для определения имен вашей собственности. Конечно, это проблематично, если у вас более одной привязки на класс, поэтому, возможно, дополнительно используйте настраиваемые атрибуты (которые также доступны через отражение), чтобы получить «подсказки» относительно правильного поля привязки, к которому должно быть привязано указанное свойство.

Это вполне может закончиться просто перемещением нерефакторируемой магической строки в другую часть приложения, хотя я не могу сказать, что пробовал это, и это сработало.

0
ответ дан 7 December 2019 в 12:23
поделиться

Рефакторинг полагается на поддержку инструментальных средств, распознающих, когда конкретный символ в коде (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 #. Если ваш бюджет не позволяет, скачайте пробную версию, и к концу ее хватит.

2
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: