gpt4 book ai didi

c# - 添加项目到集合的更新 UI 已更改

转载 作者:可可西里 更新时间:2023-11-01 11:30:12 25 4
gpt4 key购买 nike

我正在使用 ObservableCollection,稍后应该用来自 COM 端口的数据填充,这意味着它会更新很多。出于测试目的,我设置了设计时样本数据(工作正常)和运行时样本数据,但是在将项目添加到我的集合时我无法更新我的 UI。我已经在我的类中成功实现了 INotifyPropertyChanged,如下所示:

public class SensorViewModel : INotifyPropertyChanged
{
public SensorViewModel()
{
dataItems = new ObservableCollection<SensorData>();
dataItems.CollectionChanged += dataItems_CollectionChanged;
}

private ObservableCollection<SensorData> _dataItems;
public ObservableCollection<SensorData> dataItems
{
get { return _dataItems; }
set
{
_dataItems = value;
// notify of changes
NotifyPropertyChanged("dataItems");
NotifyPropertyChanged("lastItem");
}
}

public SensorData lastItem
{
get { return dataItems.Last(); }
}

public void LoadData()
{
dataItems.Add(new SensorData { id = 0, accelX = 0.231, accelY = 0.345, accelZ = -1.234 });
dataItems.Add(new SensorData { id = 1, accelX = 1.231, accelY = 1.345, accelZ = -0.234 });
}

// handle property changes
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
var handler = this.PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}

void dataItems_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// get the sender observable collection
ObservableCollection<string> obsSender = sender as ObservableCollection<string>;

List<SensorData> editedOrRemovedItems = new List<SensorData>();

if (e.NewItems != null)
{
foreach (SensorData newItem in e.NewItems)
{
editedOrRemovedItems.Add(newItem);
}
}

if (e.OldItems != null)
{
foreach (SensorData oldItem in e.OldItems)
{
editedOrRemovedItems.Add(oldItem);
}
}

// get the action which raised the collection changed event
NotifyCollectionChangedAction action = e.Action;
}
}

我在 MainWindow.xaml.cs 上创建 DataContext,然后调用 LoadData()。但是,在我名为 AccelData.xaml 的单独页面(使用 ModernUI WPF 项目的子选项卡)上,绑定(bind)不会更新。我用 {Binding lastItem.accelX} 绑定(bind)它。

我是否需要以某种方式将 DataContext 从 MainWindow 复制到子页面,或者我只是没有正确使用 CollectionChanged 事件?我似乎无法让我的绑定(bind)值出现在运行时。

最佳答案

您明确需要提高PropertyChanged lastItem 的事件 如果您希望它在 UI 上刷新。

从 collectionChanged 处理程序中执行:

void dataItems_CollectionChanged(object sender, 
NotifyCollectionChangedEventArgs e)
{
......
NotifyPropertyChanged("lastItem");
}

此外,您的 collectionChanged 处理程序对我来说没有任何意义。在列表中添加项目但不在任何地方使用它。

此外 obsSender将始终为 null 因为发件人集合的类型为 ObservableCollection<SensorData>但是您正在将其类型转换为 ObservableCollection<string> .

// get the sender observable collection (THIS WILL BE NULL ALWAYS)
ObservableCollection<string> obsSender = sender as ObservableCollection<string>;

关于c# - 添加项目到集合的更新 UI 已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22438146/

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