2015-06-08 2 views
1

Я хочу динамически отображать все мои КОНТАКТЫ в ItemsControl. У меня есть список контактов в моей логике (этот обновляется, если кто-то удалил меня или кто-то принял мой запрос), и я добавил этот список в ObservableCollection <>, который связан с ListBox.Обновить ObservableCollection, где элементы получены из другого списка

C#

Contacts = new ObservableCollection<Contact>(MyLogic.Current.Contacts); 

XAML

<ItemsControl ItemsSource="{Binding Contacts}" x:Name="MainPanel"> 

И вот проблема: Когда я хочу, чтобы добавить контакт в мой список контактов, то ObservableCollection не обновляется

MyLogic.Current.Contacts.Add(new Contact("Fred", true)); 
+0

Пожалуйста см [ «Должны ли вопросы включают„метки“? В своих названиях»] (http://meta.stackexchange.com/questions/19190/should -questions-include-tags-in-their-titles), где консенсус «нет, они не должны»! –

+0

В этом случае я предполагаю, что если вы исключаете «ObservableCollection» из заголовка, заголовок будет бессмысленным –

ответ

1

Это не лучшее решение, но если вы хотите, чтобы увидеть, где проблема, следующий код обновляет интерфейс:

var newContact = new Contact("Fred", true)); 
MyLogic.Current.Contacts.Add(newContact); 
Contacts.Add(newContact); 

Лучшее решение, когда MyLogic.Current.Contacts изменения известите UI с помощью событий.

Edit:

Проблема заключается в том, что я могу только обновить список и не ObservableCollection (сам список находится в другом проекте) ...так мне нужен способ, чтобы обновить GUI, когда этот список обновляется

уведомлять UI, когда-либо изменения ваших данных вы можете использовать события следующим образом:

Сначала определим EventArgs, который показывает недавно добавленные элементы, как это:

public class ModelAddedEventArgs<TModel> : EventArgs 
{ 
    public ModelAddedEventArgs(TModel newModel) 
    { 
     NewModel = newModel; 
    } 

    public TModel NewModel { get; set; } 
} 

Затем определяют EventHandler в вашем MyLogic Calss следующим образом:

public event EventHandler<ModelAddedEventArgs<Contact>> ContactAdded; 

    public void AddModel(Contact model) 
    { 
     // first add your contact then: 
     if (ActivityGroupAdded != null) 
      ActivityGroupAdded(this, new ModelAddedEventArgs<Contact>(model)); 
    } 

И, наконец, использовать ваш EventHandler уведомить UI:

private void YourUIConstructor() 
    { 
     MyLogic += OnContactAdded; 
    } 
    private void OnContactAdded(object sender, ModelAddedEventArgs<Contact> e) 
    { 
     Contacts.Add(e.NewModel); 
    } 
0

ObservableCollection не работает с источником List. Когда вы создаете его из существующего List, он копирует только элементы из него во внутреннее хранилище. Таким образом, вы должны добавлять элементы к самому ObservableCollection, чтобы получить то, что вы хотите и т.д.

+0

Проблема в том, что я могу только обновить LIST, а не ObservableCollection (сам список находится в другом проекте) ... так что я нужен способ обновления GUI при обновлении этого LIST. – Paytime

+0

В этом случае вы должны передать свою наблюдаемую коллекцию, чтобы обновить ее, а не список, который он обновляет сейчас. –

+0

Если вы покажете свой код, управляющий списком, я могу дать вам советы делать то, что вы хотите. –

0

Проблема у Вас есть то, что вы ожидая ObservableCollection будет автоматически обновляться при добавлении к вашему List. Это неправда.

При создании экземпляра вашей ObservableCollection, вы принимаете копию вашего List, а не ссылки на сам список.

Поэтому, когда вы добавляете новый товар, вы должны добавить в свой ObservableCollection, а не ваш List. Или оба. Но я не понимаю, зачем вам нужны оба, я бы порекомендовал вам полностью отключить ваш List.

+0

СПИСОК и графический интерфейс находятся в двух отдельных проектах, и я не хочу, чтобы GUI-проект управлял моими контактами, но только чтобы показать их – Paytime

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