2014-04-30 4 views
2

Возможно ли получить Instance элемента в рамках события CollectionChanged?CollectionChanged получить экземпляр объекта, который содержит коллекцию

Для примера:

public class Foo 
{ 
    public string Name { get; set; } 
    public ObservableCollection<Bar> Bars { get; set; } 

    public Foo() 
    { 
     Bars += HelperFoo.Bars_CollectionChanged; 
    } 
} 

public class Bar 
{ 
    public string Name { get; set; } 
} 

public static class HelperFoo 
{ 
    public static voic Bars_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     //sender is the collection Foo.Bars 
     //can I get the Instance of Foo? 
    } 
} 

(я не запомнил с помощью отражения)

Если это не будет возможно есть способ, чтобы получить экземпляр объекта, который intializes другой объект?

Для примера:

public class Foo 
{ 
    public string Name { get; set; } 

    public Foo() 
    { 
     var bar = new Bar(); //yes I know, I could write new Bar(this) and provide an overload for this 
    } 
} 

public class Bar 
{ 
    public string Name { get; set; } 

    public Bar() 
    { 
     //Get the Foo, since the constructor is called within Foo, is this possible? 
     //without providing an overload that takes an object, and just change it to `(new Bar(this))` 
    } 
} 
+0

Вы продолжаете ссылаться на 'FooA', но ваш код не имеет' FooA'. Я предполагаю, что вы имеете в виду «Foo». Ваше именование сильно затрудняет это. 'Foo' и' Bar' сделают это более читаемым. –

+0

Возможный дубликат [Как найти метод, называемый текущим методом?] (Http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current -method) –

+0

Не точный обман, но это позволит вам определить, кто вызвал ваш конструктор. –

ответ

1

Я согласен с @Gaz, но если вы действительно хотите сделать то, что вы описали, добавьте словарь в свой класс HelperFoo. Затем в классе Foo добавьте это как создатель следующим образом.

public static class HelperFoo 
{ 
    private static Dictionary<ObservableCollection<Bar>, object> lookupCreators = new Dictionary<ObservableCollection<Bar>, object>(); 

    public static void AddBarsCreator(ObservableCollection<Bar> bars, object creator) 
    { 
     lookupCreators.Add(bars, creator); 
    } 

    public static void Bars_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     ObservableCollection<Bar> bars = (ObservableCollection<Bar>)sender; 
     if (lookupCreators.ContainsKey(bars)) 
     { 

     } 
    } 
} 

public class Foo 
{ 
    public ObservableCollection<Bar> Bars { get; set; } 

    public Foo() 
    { 
     Bars = new ObservableCollection<Bar>(); 
     HelperFoo.AddBarsCreator(Bars, this); 
     Bars.CollectionChanged += HelperFoo.Bars_CollectionChanged; 
    } 
} 
1

Ваш код кажется довольно странным образом структурированы.

Если HelperFoo класса должен сделать что-то с Foo, а затем передать его Foo, и пусть это подписаться на Bar самих событий.

Если HelperFoo ничего не должно знать о Bars, а затем выставить мероприятие на Foo и подписаться на него. Вы можете поднять то событие внутри Foo, когда Bars изменений.

Прочтите на Law Of Demeter.

+0

«Если ваш класс HelperFoo должен что-то сделать с помощью Foo, тогда передайте его Foo и дайте ему подписаться на сами события Bar». ... У меня есть 500 экземпляров Foo, и все, что нужно сделать для comon, когда коллекция Foo.Bars изменяется, поэтому я считаю, что ее память хранит статическое собрание, изменившее событие вместо того, чтобы подбирать его для каждого экземпляра или Foo, но К сожалению, мне нужна некоторая информация о экземпляре Foo для правильной обработки логики в коллекции. Вы бы предложили зарегистрировать коллекцию, измененную для каждого экземпляра Foo? –

+0

У всех 500 Foos есть одна и та же коллекция баров? Или есть 500 разных коллекций? Если это так, я вряд ли думаю, что 500 подписчиков подписчиков будут иметь большое значение. – GazTheDestroyer

+0

500 различных коллекций - предметы от 0 до 300 –

Смежные вопросы