我DependencyProperty
在自定义控件中有以下内容:
public bool HasConnection
{
get { return (bool)GetValue(HasConnectionProperty); }
set { SetValue(HasConnectionProperty, value); }
}
public static readonly DependencyProperty HasConnectionProperty =
DependencyProperty.Register(
"HasConnection",
typeof(bool),
typeof(NetworkNode),
new FrameworkPropertyMetadata(
false,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
new PropertyChangedCallback(HasConnectionChangedCallBack)));
private static void HasConnectionChangedCallBack(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
NetworkNode nn = (NetworkNode)d;
Ellipse el = nn.GetTemplateChild("PART_inner") as Ellipse;
if (el.PART_inner.Visibility == ...) <-- exception el is null
//..code..
}
运行良好,但如果我在自定义控件的“属性”面板中更改属性,则在运行时会引发异常:对象引用未设置为对象的实例。
编辑1:
忘记在帖子中添加一行代码Ellipse el = nn.GetTemplateChild("PART_inner") as Ellipse;
编辑2:
创建 BooleanToVisibilityConverter 并在 Generic.xaml 中使用 Binding 有效,但 HasConnectionChangedCallBack 方法现在为空/无用。
Visibility="{Binding HasConnection, Converter={StaticResource BooleanToVisibiltyConverter}, RelativeSource={RelativeSource TemplatedParent}}"
编辑3:
找到了一个可能的修复。首先调用属性回调方法,然后调用 OnApplyTemplate() 方法,因此在 xaml 中不再抛出异常或错误。
在 OnApplyTemplate() 我添加
if (this.HasConnection)
PART_inner.Visibility = System.Windows.Visibility.Visible;
else
PART_inner.Visibility = System.Windows.Visibility.Hidden;