カスタムUserControlのターゲットのDependencyPropertyが変更されたときに、バインディングソースが更新されないようになりました。
ソースは、MEFがカスタムUserControlのDataContextにロードされたViewModelです。
MyUserControlのルートXAMLでは、バインディングは次のようになります。
// MyUserControl.xaml
<MyUserControlBase x:Class="MyUserControl" MyDependencyProperty="{Binding ViewModelProperty}">
FrameworkPropertyMetadataでMyDependencyPropertyを使用し、プロパティが変更されたときにコールバック関数を使用すると、次のことができます。これは正常に機能します。
// MyUserControlBase.cs
private static void MyDependencyProperty_Changed(DependencyObject depObj, DependencyPropertyChangedEventArgs args)
{
var filter = (UserControl )depObj;
var vm = (ViewModel)filter.DataContext;
vm.ViewModelProperty= (VMPropType)args.NewValue;
}
UserControlを継承するMyUserControlBaseへのDependencyPropertyの登録。
// MyUserControlBase.cs
public static readonly DependencyProperty MyDependencyPropertyProperty = DependencyProperty.Register("MyDependencyProperty",
typeof(VMPropType),
typeof(MyUserControlBase),
new FrameworkPropertyMetadata(null, MyDependencyProperty_Changed));
しかし、XAMLで実行したときに、単純な双方向バインディングを機能させることができないのはなぜですか?
出力ウィンドウには、バインディングの失敗は表示されません。ViewModel.ViewModelPropertyゲッターが呼び出されていることがわかります。MyDependencyPropertyが変更されると、セッターではありません。
イベントの順序に問題はないようです。ViewModelは、DependencyPropertyが初めて変更されるずっと前に作成されます。
WPFユーザーコントロール内のカスタムDependencyPropertyへのバインドの設定も確認しましたが 、実際にはDependencyPropertyを保持する独自のBaseクラスから継承しているため、彼の問題は少し異なっているようです。
助けてくれてありがとう。
編集:ソリューション例へのリンク付き。 ここでソリューションzip
恐ろしいリンクで申し訳ありませんが、私は多くのクイックファイル共有サイトを知りません。その悪い投稿コメントと私はそれをできるだけ早く削除しますが、それは大丈夫のようです。