gpt4 book ai didi

wpf - ObservableCollection 不更新 UI

转载 作者:行者123 更新时间:2023-12-01 01:38:18 38 4
gpt4 key购买 nike

我遇到了 ObservableCollection 获取新项目但未在 ListView 中反射(reflect)这些更改的问题。我在实现这一点的方式上有足够的怪癖,以至于我很难确定问题是什么。

我的 ObservableCollection 是这样实现的:

public class MessageList : ObservableCollection<LobbyMessage>
{
public MessageList(): base()
{
Add(new LobbyMessage() { Name = "System", Message = "Welcome!" });
}
}

我将集合存储在静态属性中(以便从多个用户控件轻松访问它):
static public MessageList LobbyMessages { get; set; }

在我的主 NavigationWindow 的 OnLoad 事件中,我有以下行:
ChatHelper.LobbyMessages = new MessageList();

我在 ListView 所在的 UserControl 中的 XAML 内容如下:
    <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>

我在构造函数中添加的初始消息很好地出现在 UI 中。

现在,我向集合中添加新项目的方式是来自 WCF 服务的回调。我让这段代码在 WinForms 应用程序中工作,并且有必要将回调编码到 UI 线程,所以我保留了该代码。这是该方法的缩写版本:
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);
}

在调试时,我可以看到集合已使用来自服务的消息进行更新,但 UI 并未反射(reflect)这些添加。

关于我缺少什么以使 ListView 反射(reflect)集合中的这些新项目的任何想法?

最佳答案

我解决了这个问题。

静态属性或传入数据的上下文都与该问题无关(事后看来这很明显)。

由于某种原因,从 Expression Blend 生成的 XAML 不能胜任这项任务。我所做的只是将 ItemSource 分配给 C# 中的集合。

ListBoxChatMessages.ItemsSource = ChatHelper.LobbyMessages.Messages;

我的 XAML 现在更加简化了。
<ListBox IsSynchronizedWithCurrentItem="True" 
ItemsSource="{Binding Mode=OneWay}" Background="#FF1F1F1F"
Margin="223,18.084,15.957,67.787" x:Name="ListBoxChatMessages"
ItemTemplate="{DynamicResource MessageListTemplate}"
IsEnabled="True"/>

我有点困惑为什么会这样。我正在阅读有关如何在 WPF 中绑定(bind)数据的 MSDN 文章,其中包括几个绑定(bind)对象、引用对象的属性等。我不明白为什么当 UserControl 的构造函数中的一行代码执行把戏就好了。

关于wpf - ObservableCollection<T> 不更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/349957/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com