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

时间:2019-05-07 01:14:41

标签: c# wpf

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

有些事情很简单,例如,可以在C#中轻松设置所有表格的背景。但是,代码隐藏中的DataBinding比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:'值不能为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而不是完全不设置它。

1 个答案:

答案 0 :(得分:1)

表达式

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

意味着在作为第一个参数传递的对象的BorderBrush属性(即Window的BorderBrush属性的值)上设置绑定。这没有任何意义,因为该对象是不具有BorderBrush属性的SolidColorBrush。

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

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

或使用窗口的SetBinding方法:

SetBinding(
    BorderBrushProperty,
    GetBinding("IsActive", new IsActiveToBrushConverter()));