WPFコントロールに奇妙な問題があります。基本的に、プライマリコンテンツの前にモーダルコンテンツを表示するコントロールがあります。私のコントロールは、ここに示されている私の答えの修正です。
モーダルコンテンツを非表示/表示するために使用されるというBool
依存関係プロパティがあります。IsShown
プロパティは次のように定義されます。
public static readonly DependencyProperty IsShownProperty =
= DependencyProperty.Register("IsShown",
typeof(bool),
typeof(ModalContentControl),
new UIPropertyMetadata(false, IsShownChangedCallback));
次のような標準の.Netプロパティラッパーがあります。
public bool IsShown
{
get { return (bool)GetValue(IsShownProperty); }
set { SetValue(IsShownProperty, value); }
}
プロパティが変更されたコールバックは次のようになります。
private static void IsShownChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ModalContentControl control = (ModalContentControl)d;
if ((bool)e.NewValue == true)
{
control.ShowModalContent();
}
else
{
control.HideModalContent();
}
}
およびメソッドにはShowModalContent
、HideModalContent
モーダルコンテンツをそれぞれ表示および非表示にするロジックが含まれています。
ウィンドウにこのコントロールがあり、IsShown
プロパティはviewModelにバインドされています。IsShown
コントロールのプロパティにバインドされているブールプロパティを変更するコマンドを呼び出すボタンを押すことができます。モーダルコンテンツは、期待どおりに表示および非表示になります。
私の問題は、メソッドShowModalContent
とHideModalContent
メソッドが公開されているため、コードから呼び出すことができるという事実にあります。ShowModalContent
たとえば、私がやりたいのは呼び出しです。IsShown
プロパティをクエリすると、正しい値(この場合はtrue)が報告されます。EG通常のプロパティを使用している場合は、次のようなタイプのバッキングフィールドがありますBool
。メソッドで更新されます。このフィールドは、プロパティgetステートメントによって返されます。
しかし、私のプロパティは依存関係プロパティであるため、バッキングフィールドにアクセスできません。メソッドから値を更新する唯一の方法は、.netラッパーを介して依存関係プロパティを設定することですが、これによりコントロールが機能しなくなります(コンテンツが表示されると、再度削除することはできません)。
IsShown
この動作は、プロパティ変更コールバックを呼び出すメソッドでプロパティを設定することによって引き起こされる可能性があると思いました。呼び出し元のIsShown
プロパティを設定します。しかし、WPFがこのシナリオから保護することをどこかで読んだことを覚えています。
では、ブール依存関係プロパティが正しい値を報告するように、この問題を修正するにはどうすればよいですか?