2015-12-11 2 views
0

У меня есть класс, который представляет собой набор (MapAdapter) и принимает коллекцию в качестве параметра конструктора .MapAdater добавляет объект Map на CollectionChanged:Уведомлять о свойствах в другом классе при изменении свойства?

public MapAdapter(UndoRedoCollection undoRedoCollection) 
{ 
    this.undoRedoCollection = undoRedoCollection; 
    this.undoRedoCollection.CollectionChanged += this.OnCollectionChanged; 
    } 

Это моя коллекция изменилось событие, в котором добавляются объекты Карта:

private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     GetMapRules(TurbineUndoRedoCollection); 

    } 

private void GetMapRules(UndoRedoCollection undoRedoCollection) 
{ 
    foreach (var item in undoRedoCollection) 
    { 
     this.Add(new Map(item)); 
     } 
    } 

у меня есть свойство на MapAdapter, который определяет, отображается ли слой на карте:

public bool IsLayerVisible 
     { 
      get 
      { 
       return this.isLayerVisible; 
      } 

      set 
      { 
       this.isLayerVisible = value; 
       this.OnPropertyChanged(new PropertyChangedEventArgs("IsLayerVisible")); 
      } 
     } 

У меня есть аналогичная собственность на моем классе Map. Мне нужно послушать IsLayerVisible Свойство на моем MapAdapter и сменить IsLayerVisible на каждой из моих карт в коллекции MapAdapter. Причина в том, что у меня есть элемент управления, который рисует изображение и передается в Map, он ничего не знает о MapAdater, поэтому я не могу контролировать, когда &, когда не рисовать на основе видимости.

+0

Итак, что не работает для вас? –

ответ

1

Если в заголовке сообщения есть какие-либо сведения о том, что вы пытаетесь сделать, все, что вам нужно сделать, это реализовать интерфейс INotifyPropertyChanged и запустить событие PropertyChanged, когда изменяется значение вашего имущества.

Затем измените конструктор своей карты, чтобы принять экземпляр MapAdapter. Вам не нужно содержать ссылку на MapAdapter в пределах Map, просто используйте ее для подключения обработчика событий для события PropertyChanged против вашего MapAdapter.

Вот пример того, что Map класс может выглядеть ...

public class Map 
{ 
    public Map(object item, MapAdapter adapter) 
    { 
     ... 
     adapter.PropertyChanged += this.AdapterPropertyChanged; 
    } 

    private void AdapterPropertyChanged(object sender, PropertyChangedEventArg e) 
    { 
     if (e.PropertyName == "IsLayerVisible") 
     { 
      // Do something 
     } 
    } 
} 

А затем обновить ваш метод GetMapRules как так ...

private void GetMapRules(UndoRedoCollection undoRedoCollection) 
{ 
    foreach (var item in undoRedoCollection) 
    { 
     this.Add(new Map(item, this)); 
     } 
    } 
} 
+0

INPC реализован в MapAdapter & Я вызываю PropertyChanged на сеттер IsLayerVisible. Я пытаюсь использовать PropertyChangedEventManager в классе Map, однако класс Map не знает экземпляр MapAdapter, поэтому я не могу его слушать? PropertyChangedEventManager.AddListener (?, This, "IsLayerVisible"); – Hardgraf

+1

Можете ли вы передать ссылку MapAdapter на карту в конструкторе? – Randy

1

Посмотрите паб-Sub или Шаблоны агрегаторов событий.

В частности, Prism has an implementation что может представлять интерес.

У этого link есть отдельный пример этого рисунка, который может быть поучительным.

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