У меня возникла проблема с ObservableCollection, получающей новые элементы, но не отражающие эти изменения в ListView. У меня достаточно причуд в том, как я реализую это, что мне сложно определить, в чем проблема.ObservableCollection <T> не обновляется UI
Мой ObservableCollection осуществляется таким образом:
public class MessageList : ObservableCollection<LobbyMessage>
{
public MessageList(): base()
{
Add(new LobbyMessage() { Name = "System", Message = "Welcome!" });
}
}
хранить коллекцию в статическом свойстве (так что его легко доступны из нескольких пользовательских элементов управления):
static public MessageList LobbyMessages { get; set; }
В OnLoad случае моего main NavigationWindow У меня есть следующая строка:
ChatHelper.LobbyMessages = new MessageList();
My X AML в UserControl, где находится ListView гласит:
<ListBox IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Mode=OneWay}"
x:Name="ListBoxChatMessages"
d:UseSampleData="True"
ItemTemplate="{DynamicResource MessageListTemplate}"
IsEnabled="True">
<ListBox.DataContext>
<Magrathea_Words_Tools:MessageList/>
</ListBox.DataContext>
</ListBox>
Исходное сообщение, которое я добавил в конструкторе в пользовательском интерфейсе появляется просто отлично.
Теперь, когда я добавляю новые элементы в коллекцию, это из CallBack, поступающего из службы WCF. У меня был этот код, работающий в приложении WinForms, и было необходимо обработать обратный вызов для потока пользовательского интерфейса, поэтому я оставил этот код на месте. Вот сокращенный вариант метода:
Helper.Context = SynchronizationContext.Current;
#region IServiceMessageCallback Members
/// <summary>
/// Callback handler for when the service has a message for
/// this client
/// </summary>
/// <param name="serviceMessage"></param>
public void OnReceivedServiceMessage(ServiceMessage serviceMessage)
{
// This is being called from the WCF service on it's own thread so
// we have to marshall the call back to this thread.
SendOrPostCallback callback = delegate
{
switch (serviceMessage.MessageType)
{
case MessageType.ChatMessage:
ChatHelper.LobbyMessages.Add(
new LobbyMessage()
{
Name = serviceMessage.OriginatingPlayer.Name,
Message = serviceMessage.Message
});
break;
default:
break;
}
};
Helper.Context.Post(callback, null);
}
При отладке я могу видеть коллекцию получать обновленную с сообщениями от службы, но интерфейс не отражает эти дополнения.
Любые идеи о том, чего мне не хватает, чтобы ListView отражал эти новые элементы в коллекции?
Как я понимаю, намерения MS в WPF было сделать такие вещи, как установление обязательных источников (например, свойства ItemsSource) настройки статических данных в XAML, а не в коде. Более опытный разработчик переделал мою сложную программу практически без C# и только немного больше xaml. xaml> код. – 2008-12-09 14:46:07