3

この質問をSilverlightフォーラムに投稿しましたが、問題を解決するための回答を得ることができなかったため、SOの第一人者がお役に立てば幸いです。

基本的に、親のビューモデルにエンティティプロパティがあります。このエンティティが変更された場合、子ビューモデルにエンティティのIDが必要です。依存関係プロパティを使用して子コントロールを作成し、コンストラクターでバインディングを作成しました。私はMVVMとMEFを使用してこれらすべてを実装しようとしています。

私のParentViewModel:

[ExportPlugin(ViewModelTypes.ParentViewModel, PluginType.ViewModel)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ParentViewModel: ViewModelBase
{
    private Person _currentPerson;
    public Person CurrentPerson
    {
        get { return _currentPerson; }
        private set
        {
            if (!ReferenceEquals(_currentPerson, value))
            {
                _currentPerson= value;
                RaisePropertyChanged("CurrentPerson");
            }
        }
    }
}

私のParentUserControl:

<UserControl x:Class="MyApp.ParentUserControl" x:Name="ParentControl">
        <local:ChildUserControl PersonID="{Binding ElementName=ParentControl, Mode=TwoWay, Path=DataContext.CurrentPerson.ID}" />
</UserControl>

私のChildUserControlコードビハインド:

public partial class ChildUserControl : UserControl
{
    #region Private Properties
    private PluginCatalogService _catalogService = PluginCatalogService.Instance;
    #endregion

    #region Dependency Properties
    public static readonly DependencyProperty PersonIDProperty = 
        DependencyProperty.Register("PersonID", typeof(int), typeof(ChildUserControl), new PropertyMetadata(OnPersonIDChanged));
    #endregion

    #region Public Properties
    public int PersonID
    {
        get { return (int)GetValue(PersonIDProperty); }
        set { SetValue(PersonIDProperty, value); }
    }
    #endregion

    #region Constructor
    public ChildUserControl()
    {
        InitializeComponent();

        if (!ViewModelBase.IsInDesignModeStatic)
            this.DataContext = _catalogService.FindPlugin(ViewModelTypes.ChildViewModel, PluginType.ViewModel);

        this.SetBinding(PersonIDProperty, new Binding("PersonID") { Mode = BindingMode.TwoWay, Source = DataContext, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });
    }
    #endregion

private static void OnPersonIDChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ...
}

私のChildViewModel:

[ExportPlugin(ViewModelTypes.ChildViewModel, PluginType.ViewModel)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChildViewModel: ViewModelBase
{
    private int _personID;
    public int PersonID
    {
        get { return _personID; }
        set
        {
            if (!ReferenceEquals(_personID, value))
            {
                _personID= value;
                RaisePropertyChanged("PersonID");
            }
        }
    }
}

OnPersonIDChangedイベントを作成して、CurrentPersonエンティティが変更されたときに、変更がで取得されているかどうかを確認しましたChildControl。で取り上げられていないだけですChildControl ViewModel

どんな助けでも大歓迎です。

4

1 に答える 1

0

できれば、PRISM を使用している場合は、EventAggregator を使用できます。 .com/

別のオプションは、PropertyChanged にフック (ハッキング) することです。

ViewModel1.PropertyChanged += (s, e) =>
{
   if (e.PropertyName == "XXX")
   {
      ViewModel2.PropertyX = vm1.PropertY;
   }
};
于 2014-02-20T18:45:28.143 に答える