Я реализую базовый класс окна для приложения 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, что и вообще не устанавливается.