0

私のモデルは以下の通りです。

public class FItem
    {
        public FItem()
        {
            FSubsystems = new BindingList<FSubsystem>();            
        }

        public int RecordId { get; set; }
        public string ItemName { get; set; }


        public BindingList<FSubsystem> FSubsystems { get; set; }


    }

    public class FSubsystem
    {
        public int SubSystemID { get; set; }
        public string ItemName { get; set; }
        public int YearID { get; set; }
    }

コード :

FItems = new ObservableCollection<MarketRecord.FItem>();
FItems.CollectionChanged += OnUiCollectionChanged;


        private void OnUiCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                var addedItem = e.NewItems[0] as MarketRecord.FItem;
                if (addedItem != null)
                {
                    addedItem.PropertyChanged += OnColumnModified;

                    if (addedItem.RecordId == 0)
                        modifedItems.Add(addedItem);


                    addedItem.FSubsystems.ListChanged += OnColumnModified;

                }
            }
        }






private void OnColumnModified(object sender, EventArgs e)
     {
        if (sender.GetType().Name == "FItem")
        {
            MarketRecord.FItem modifiedItem = (sender as MarketRecord.FItem);
            if (!modifedItems.Contains(modifiedItem))
                modifedItems.Add(modifiedItem);
        }
        else
        {
            // add parent of the binding list (i.e fitem object ) add it to             modifedItems

// Find parent here 
        }

     }

私のコードが示すように、 OnColumnModified の else 句でバインディング リストの親を見つける必要があります。これどうやってするの ?

4

1 に答える 1

2

現在コードを構成している方法では、これは実際には不可能です。

これは、匿名メソッドを使用して実現できます。

addedItem.FSubsystems.ListChanged += (s, e) => OnColumnModified(addedItem, e);

これにより、匿名メソッドが のイベント ハンドラとして登録されListChangedます。senderそのイベントが発生すると、イベントの引数が破棄され、代わりにインスタンスが渡されaddedItemますFItem

次のように変更することで、このコードのタイプ セーフを少し改善できますOnColumnModified

private void OnColumnModified(MarketRecord.FItem modifieditem)
{
    if(!modifiedItems.Contains(modifiedItem))
        modifiedItems.Add(modifiedItem);
}

イベント登録は次のようになります。

addedItem.PropertyChanged += (s, e) => OnColumnModified(addedItem);

addedItem.FSubsystems.ListChanged += (s, e) => OnColumnModified(addedItem);
于 2013-01-23T07:35:48.253 に答える