почему конвертер wpf показывает синий загогулины? - PullRequest
0 голосов
/ 21 декабря 2018

У меня действительно простой конвертер WPF:

internal class FlatTreeMarginConverter : IValueConverter
{
    #region Fields

    private static readonly Thickness _emptyThickness = new Thickness(0, 0, 0, 0);

    #endregion

    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        FlatTreeViewItem tvi = value as FlatTreeViewItem;

        if (tvi == null)
            return _emptyThickness;

        int nLevel = -1;

        while (tvi != null)
        {
            tvi = tvi.GetVisualAncestor<FlatTreeViewItem>();
            nLevel++;
        }

        return new Thickness(19 * nLevel, 0, 0, 0);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

По какой-то причине объявление в Xaml имеет синюю загвоздку под исключением «Ссылка на объект не установлена ​​на экземпляр.».Объявление выглядит так:

Я не понимаю ... все в моем коде безопасно.Есть идеи?Или просто какая-то случайная ошибка VS?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

У вас есть открытые методы во внутреннем классе.Сделайте класс общедоступным, очистите и восстановите.Публичные методы / свойства понижаются до внутреннего во внутреннем классе.

Какие бы процессы xaml не были полностью надежными, и довольно часто встречаются подобные ложные голубые извилины.
Он использует отражение, чтобы проверить, являются ли преобразователи икак в exe.Вот почему вам нужно скомпилировать, прежде чем конвертер потеряет сквогли.Насколько я понимаю, это означает, что конвертеры должны быть открытыми.

Для VS также довольно распространено придерживаться старых определений вещей, если вы не очистите их явно.... это раскручивается нормально?

Кстати, я также рекомендую подход markupextension, который позволяет вам использовать конвертеры, не делая их ресурсом в xaml.

Например:

public class IsOfTypeConverter : MarkupExtension, IValueConverter
{
    public Type TypeToCompare { get; set; }

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.GetType() == TypeToCompare;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return null;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

Может использоваться:

   <DataTrigger Binding="{Binding ., Converter={ui:IsOfTypeConverter TypeToCompare={x:Type ui:PlaceVM}}}" Value="True">
0 голосов
/ 21 декабря 2018

Я не вижу, где «Ссылка на объект не установлена ​​на экземпляр».может появиться в коде, который вы показываете.Так что это должно прийти откуда-то еще ...

Есть нюанс для отладки и понимания, где "Ссылка на объект не установлена ​​на экземпляр".

Вы можете присоединить один экземпляр Visual Studio к текущему экземпляру Visual Studio, используя «Присоединить к процессу» (и выбрав devenv.exe).
Взгляните на Присоединитьотладчик на другой экземпляр Visual Studio .
Не забудьте поставить галочку «Брошено» для всех исключений в DEBUG / Exeptions после выполнения «Присоединения к процессу»

Как только вы это сделаете, вы откроете свойФайл Xaml.
Исключение "Ссылка на объект не установлена ​​на экземпляр."будет брошен и пойман другим экземпляром визуальной студии, позволяющей увидеть, откуда он взялся.Позволяет вам отладить ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...