我正在为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而不是完全不设置它。
答案 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()));