gpt4 book ai didi

wpf - 使用 WPF 在 F# 中使用 INotifyPropertyChanged 和 INotifyCollectionChanged

转载 作者:行者123 更新时间:2023-12-04 14:12:00 25 4
gpt4 key购买 nike

我有一个样本信息数组,在后台线程中不断刷新。

目前,我经常使用 DispatcherTimer 将此数组分配给数据网格的 ItemsSource 属性。这行得通,但它会重置任何视觉位置,例如,如果用户将光标放在数据网格的中间,则执行计时器将撤消此类位置。

是否可以为此使用 INotifyPropertyChanged 或 INotifyCollectionChanged 事件来防止此类情况发生?如果是这样,这如何与 F# 一起工作?

我想每次数组更新时我都必须执行一些通知数据网格的函数。数组的更新不在 STAThread 部分。

我正在使用包含 WPF 数据网格的最新 WPF 工具包运行 VS2010。

最佳答案

您可以使用 ObservableCollection,它会为您实现 INotifyCollectionChanged。 F# 看起来像这样:

open System
open System.Collections.ObjectModel
open System.Windows
open System.Windows.Controls
open System.Windows.Threading

[<EntryPoint; STAThread>]
let Main args =

let data = ObservableCollection [0 .. 9]
let list = ListBox(ItemsSource = data)
let win = Window(Content = list, Visibility = Visibility.Visible)
let rnd = Random()

let callback =
EventHandler(fun sender args ->
let idx = rnd.Next(0, 10)
data.[idx] <- rnd.Next(0, 10)
)

let ts = TimeSpan(1000000L)
let dp = DispatcherPriority.Send
let cd = Dispatcher.CurrentDispatcher

let timer = DispatcherTimer(ts, dp, callback, cd) in timer.Start()
let app = Application() in app.Run(win)

不幸的是,Reflector 显示 System.Windows.Controls.ItemsControl.OnItemCollectionChanged 方法在调用时删除了选择,因此您可能需要解决此默认行为。

您还可以像这样实现 INotifyPropertyChanged:

open System.ComponentModel

type MyObservable() =

let mutable propval = 0.0
let evt = Event<_,_>()

interface INotifyPropertyChanged with

[<CLIEvent>]
member this.PropertyChanged = evt.Publish

member this.MyProperty

with get() = propval
and set(v) = propval <- v
evt.Trigger(this, PropertyChangedEventArgs("MyProperty"))

实现 INotifyCollectionChanged 的​​工作方式类似。

祝你好运

丹尼

关于wpf - 使用 WPF 在 F# 中使用 INotifyPropertyChanged 和 INotifyCollectionChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1147885/

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