0

AddNewProductRowViewテキストボックスのドロップダウンなどのいくつかの基本的な要素を持つユーザーコントロール ( ) があります。その UserControl を ViewModel - にバインドしていAddNewProductRowViewModelます。次に、ListBox を持つ MainWindow があり、その itemsource は上記の userControl ( AddNewProductRowViewModelList) のリストです。MainWindow は DataModel - にバインドしますAddNewProductViewModel。AddNewProductViewModel にはAddNewProductRowViewModelList、ユーザー コントロールを動的に追加するプロパティが含まれています。また、プロパティ変更イベントを次のように配線します-

AddNewProductRowViewModelList = new ObservableCollection<AddNewProductRowViewModel>();
        AddNewProductRowViewModel objAddNewProductRowViewModel;
        for (int row = 1; row <= 5; row++)
        {
            objAddNewProductRowViewModel = new AddNewProductRowViewModel();
            AddNewProductRowViewModelList.Add(objAddNewProductRowViewModel);
            objAddNewProductRowViewModel.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
            {
                if (string.Equals("ProductNo", e.PropertyName, StringComparison.Ordinal))
                {
                    this.OnPropertyChanged(new PropertyChangedEventArgs("ProductNo"));
                }
            };
        }

ProductNoの userControl にバインドされたプロパティの 1 つを次に示しますAddNewProductRowViewModel。両方のモデルが実装されてINotifyPropertyChangedいます。コントロールは期待どおりにレンダリングされ、製品番号の textBox をOnPropertyChanged子、つまりAddNewProductRowViewModelfires で変更すると、同じことが親 ViewModel にトラップされません。

私が間違っていることについてアドバイスしてください。事実、私は DropDownList に対しても同じことを行いました - 状態のリスト State に対して、まったく同じ方法でイベントを配線しました。それはうまくいきます... :(。

ここでわかる唯一の違いは、今はユーザー コントロールを使用していることです。

前もって感謝します。

編集 その後、コードを次のように編集しました-Kent Boogaart's answer

AddNewProductRowViewModelList = new ItemObservableCollection<AddNewProductRowViewModel>();
 AddNewProductRowViewModelList.CollectionChanged += OnAddNewProductViewModelListChanged;

 AddNewProductRowViewModel objAddNewProductRowViewModel;
 for (int row = 1; row <= 5; row++)
 {
    objAddNewProductRowViewModel = new AddNewProductRowViewModel();
    AddNewProductRowViewModelList.Add(objAddNewProductRowViewModel);
 }
 AddNewProductRowViewModelList.ItemPropertyChanged += OnAddNewProductRowViewModelItemChanged;

これら2つの方法を追加しました -

void OnAddNewProductViewModelListChanged(object sender, NotifyCollectionChangedEventArgs e)
 {

 }

 void OnAddNewProductRowViewModelItemChanged(object sender, EventArgs e)
 {

 }

最初のものはアイテムを追加するときに呼び出されます.2番目のものはProductNoを更新するときではありません.

解決策 : 頭を何度も叩いた後、これに気づきました...

AddNewProductRowViewクラス内、コンストラクター内...

public partial class AddNewProductRowView : UserControl
    {
        public AddNewProductRowViewModel ViewModel { get; private set; }

        public AddNewProductRowView()
        {
            InitializeComponent();
            ViewModel = new AddNewProductRowViewModel();
            DataContext = ViewModel;
        }
    }

DataContext今..新しいを割り当てているViewModelため、親に添付したバインディングが失われていました。

私の悪い... この質問が誰かが彼/彼女の概念をクリアするのに役立つことを願っています.

興味を持ってくれたすべての人に感謝します。

ケースクローズ!!

4

0 に答える 0