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:
投稿にコードを 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;