System.ArgumentNullException при реализации базового класса окна в приложении WPF - PullRequest
0 голосов
/ 07 мая 2019

Я реализую базовый класс окна для приложения WPF, чтобы несколько моих окон могли совместно использовать код. Visual Studio не позволяет определять базовый класс окна в приложении WPF с помощью XAML, все должно быть определено в codebehind.

Некоторые вещи просты, например, фон всех форм может быть легко установлен в C #. Однако DataBinding в codebehind более сложен, чем в XAML. Я пытаюсь преобразовать этот рабочий код XAML:

    <Window.BorderBrush>
        <Binding ElementName="Automator" Path="IsActive" Converter="{StaticResource IsActiveToBrushConverter}" UpdateSourceTrigger="PropertyChanged"/>
    </Window.BorderBrush>

В C # для кода. Я преобразовал это в следующее:

        BindingOperations.SetBinding(
                BorderBrush,
                BorderBrushProperty,
                GetBinding("IsActive", new IsActiveToBrushConverter()));

Для справки, GetBinding:

private Binding GetBinding(string path, IValueConverter converter, BindingMode binding = BindingMode.Default)
        {
            return new Binding(path)
            {
                Converter = converter,
                UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged,
                Source = this,
                Mode = binding
            };
        }

Этот код приводит к исключению: System.ArgumentNullException: 'Значение не может быть нулевым. Имя параметра: цель '. Я подумал, что смогу решить эту проблему, предварительно установив BorderBrush, а затем сразу же связавшись с ним (GetSolidColorBrush - это локальный метод, который не требует пояснений):

        BorderBrush = GetSolidColorBrush("#ff0000");
        BindingOperations.SetBinding(
                BorderBrush,
                BorderBrushProperty,
                GetBinding("IsActive", new IsActiveToBrushConverter()));

Для справки, GetSolidColorBrush:

private SolidColorBrush GetSolidColorBrush(string colorString)
        {
            var color = (Color)ColorConverter.ConvertFromString(colorString);
            return new SolidColorBrush(color);
        }

Хотя этот код предотвращает исключение и, по-видимому, разрешает привязку к функции (точки отладки подтверждают, что IsActiveToBrushConverter вызывается при изменении свойства формы IsActive), свойство BorderBrush не корректируется - оно остается красным (статический цвет Я установил, чтобы предотвратить ArgumentNullException). Кажется, когда BorderBrush установлен на статическое значение, он переопределяет значение, которое устанавливает привязка. Я также пробовал BorderBrush.SetCurrentValue в надежде, что это значение может быть переопределено связыванием, но это приводит к тому же ArgumentNullException, что и вообще не устанавливается.

1 Ответ

1 голос
/ 07 мая 2019

Выражение

BindingOperations.SetBinding(
    BorderBrush,
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));

означает установить привязку к свойству BorderBrush объекта, переданного в качестве первого аргумента (т. Е. Значение свойства BorderBrush окна).Это не имеет смысла, поскольку объект представляет собой SolidColorBrush, у которого нет свойства BorderBrush.

Правильный способ установки привязки для свойства BorderBrush окна -

BindingOperations.SetBinding(
    this,
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));

илииспользовать метод Window SetBinding:

SetBinding(
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...