gpt4 book ai didi

c# - 添加/删除行时 WPF DataGrid 是否触发事件?

转载 作者:太空狗 更新时间:2023-10-29 20:08:07 26 4
gpt4 key购买 nike

每次 DataGrid 获得更多行或删除一些行时,我都希望重新计算。我尝试使用 Loaded 事件,但只触发了一次。

我找到了 AddingNewItem , 但它在添加之前就被解雇了。 之后我需要做我的事情。

还有 LayoutUpdated,它可以工作,但我担心使用它并不明智,因为它对我的目的来说太频繁了。

最佳答案

如果您的 DataGrid 绑定(bind)到某物,我想到了两种方法。

您可以尝试获取 DataGrid.ItemsSource 集合,并订阅其 CollectionChanged 事件。这只有在您首先知道它是什么类型的集合时才有效。

// Be warned that the `Loaded` event runs anytime the window loads into view,
// so you will probably want to include an Unloaded event that detaches the
// collection
private void DataGrid_Loaded(object sender, RoutedEventArgs e)
{
var dg = (DataGrid)sender;
if (dg == null || dg.ItemsSource == null) return;

var sourceCollection = dg.ItemsSource as ObservableCollection<ViewModelBase>;
if (sourceCollection == null) return;

sourceCollection .CollectionChanged +=
new NotifyCollectionChangedEventHandler(DataGrid_CollectionChanged);
}

void DataGrid_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// Execute your logic here
}

另一种解决方案是使用事件系统,例如 Microsoft Prism 的 EventAggregator 或 MVVM Light 的 Messenger。这意味着您的 ViewModel 会在绑定(bind)集合发生更改时广播 DataCollectionChanged 事件消息,并且您的 View 会订阅以接收这些消息并执行您的代码任何时候发生。

使用 EventAggregator

// Subscribe
eventAggregator.GetEvent<CollectionChangedMessage>().Subscribe(DoWork);

// Broadcast
eventAggregator.GetEvent<CollectionChangedMessage>().Publish();

使用 Messenger

//Subscribe
Messenger.Default.Register<CollectionChangedMessage>(DoWork);

// Broadcast
Messenger.Default.Send<CollectionChangedMessage>()

关于c# - 添加/删除行时 WPF DataGrid 是否触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293607/

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