C# 在WPF应用程序中实现基窗口类时System.ArgumentNullException

C# 在WPF应用程序中实现基窗口类时System.ArgumentNullException,c#,wpf,C#,Wpf,我正在为WPF应用程序实现一个基本窗口类,以便我的许多窗口可以共享代码。Visual Studio不允许使用XAML定义WPF应用程序中的基窗口类,所有内容都必须在codebehind中定义 有些事情很简单,例如,所有表单的背景都可以用C轻松设置。但是,codebehind中的数据绑定比XAML更具挑战性。我正在尝试转换此工作XAML代码: <Window.BorderBrush> <Binding ElementName="Automator" Pat

我正在为WPF应用程序实现一个基本窗口类,以便我的许多窗口可以共享代码。Visual Studio不允许使用XAML定义WPF应用程序中的基窗口类,所有内容都必须在codebehind中定义

有些事情很简单,例如,所有表单的背景都可以用C轻松设置。但是,codebehind中的数据绑定比XAML更具挑战性。我正在尝试转换此工作XAML代码:

    <Window.BorderBrush>
        <Binding ElementName="Automator" Path="IsActive" Converter="{StaticResource IsActiveToBrushConverter}" UpdateSourceTrigger="PropertyChanged"/>
    </Window.BorderBrush>
作为参考,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:'值不能为null。参数名称:target'。我想我可以通过提前设置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);
        }
虽然此代码可防止异常,并允许绑定到函数调试断点确认在表单IsActive属性更改时调用IsActiveToBrushConverter,但BorderBrush属性未调整-它保持为红色,即我为防止ArgumentNullException而设置的静态颜色。当BorderBrush设置为静态值时,它似乎会覆盖绑定设置的值。我还尝试了BorderBrush.SetCurrentValue,希望该值可以被绑定覆盖,但这会导致与根本不设置它相同的ArgumentNullException

BindingOperations.SetBinding(
    BorderBrush,
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));
表示在作为第一个参数传递的对象的BorderBrush属性上设置绑定,即窗口的BorderBrush属性的值。这没有任何意义,因为对象是没有BorderBrush属性的SolidColorBrush

在窗口的BorderBrush属性上设置绑定的正确方法是

BindingOperations.SetBinding(
    this,
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));
或使用窗口的设置绑定方法:

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