有以下情况:ViewModel
有一个变化非常快的对象。 (通过不同的线程)
View
通过以下方式获悉NotifyPropertyChanged
界面,但似乎它的工作速度很慢,并且在视图绑定新值并绘制它之前,它会更改更多次,因此它会丢失一些值。
我也尝试过绑定View
然后排队ViewModel
could Enqueue
it and View
可以通过出队进行绘制。
不幸的是又出现了一个问题:之后RaisePropertyChanged(() => queue);
View
没有被告知它已被更改。
在这种情况下,实施INotifyPropertyChanged
界面不起作用。
你有什么主意吗?
的示例代码ViewModel
:
public class ExamplaryViewModel
{
public ExamplaryViewModel()
{
Messenger.Default.Register<NotificationMessage<Message>>(this, m => ProcessNotificationMessage(m.Content));
}
public void ProcessNotificationMessage(Message message)
{
MessageOftenBeingChanged = message;
RaisePropertyChanged(() => MessageOftenBeingChanged );
}
}
View
绑定到MessageOftenBeingChanged
.
另一种选择是按照评论中的建议准备快照:
public void ProcessNotificationMessage(Message message)
{
Messages.Enqueue(message);
RaisePropertyChanged(() => Messages);
}
View
:
<controls:RichTextBoxMonitor Messages="{Binding Messages}
Control
:
public class BindableRichTextBox : RichTextBox
{
public static readonly DependencyProperty MessagesProperty = DependencyProperty.Register("Messages",
typeof(ConcurrentQueue<Message>), typeof(BindableRichTextBox ), new FrameworkPropertyMetadata(null, OnQueueChangedChanged));
public ConcurrentQueue<Message> CyclicMessages
{
get { return (ConcurrentQueue<Message>)GetValue(MessagesProperty ); }
set { SetValue(MessagesProperty , value); }
但不幸的是RaisePropertyChanged()
方法不会触发发生的更改。
我计划控制事件OnQueueChangedChanged
尝试出列并将项目绘制为段落的新内联。