🙌

ReactiveProperty 7.10.0 をリリースしました

2021/04/29に公開

GitHub の Releases には毎回変更点を書いているのですが、日本語でのリリース情報を最近さぼっていました。なので前回書いた 7.8.0 以降の以下のバージョンでの更新内容について紹介します。

  • 7.8.1
  • 7.8.2
  • 7.8.3
  • 7.9.0
  • 7.10.0

7.8.1

IFilteredObservableCollection でソースのコレクションが Reset イベントを発行した場合に過去のバージョンでは未サポートでしたが、このバージョンから Reset イベントにも対応しました。

7.8.2/7.8.3

INotifyPropertyChanged インターフェースの拡張メソッドの ObserveProperty で以下の不具合があったため修正しました。

  • ObservePropertyobj.ObserveProperty(x => x.AProperty.BProperty) のようにネストしたプロパティを指定したときに、プロパティの途中に INotifyPropertyChanged を実装していない型があると正しく動作しない不具合に対応しました。
  • ObservePropertyobj.ObserveProperty(x => x.AProperty.BProperty) のようにネストしたプロパティを指定したときに、プロパティの途中の値が別の型に変わったときに正しく動作しない不具合に対応しました。

7.9.0

  • ObservableCollectionReadOnlyObservableCollectionIFilteredObservableCollection ように定義されている ObserveElementPropertyChanged, ObserveElementObservablePropertyObserveElementProperty 拡張メソッドを、その他のコレクションに定義するためのヘルパークラスの Reactive.Bindings.CollectionUtilities を追加しました。

以下のように使用します。

public class YourCollectionExtensions
{
    public static IObservable<PropertyPack<TElement, TProperty>> ObserveElementProperty<TElement, TProperty>(this YourCollection<TElement> source, Expression<Func<TElement, TProperty>> propertySelector, bool isPushCurrentValueAtFirst = true)
        where TElement : class, INotifyPropertyChanged =>
        CollectionUtilities.ObserveElementProperty(source, propertySelector, isPushCurrentValueAtFirst);

    public static IObservable<PropertyPack<TElement, TProperty>> ObserveElementObservableProperty<TElement, TProperty>(this YourCollection<TElement> source, Expression<Func<TElement, IObservable<TProperty>>> propertySelector)
        where TElement : class =>
        CollectionUtilities.ObserveElementObservableProperty(source, propertySelector);

    public static IObservable<SenderEventArgsPair<TElement, PropertyChangedEventArgs>> ObserveElementPropertyChanged<TElement>(this YourCollection<TElement> source)
        where TElement : class, INotifyPropertyChanged =>
        CollectionUtilities.ObserveElementPropertyChanged<YourCollection<TElement>, TElement>(source);
}

7.10.0

WPF アプリケーション用に最適化された ReactivePropertyWpfScheduler を追加しました。
従来のデフォルトの SynchronizationContextScheduler では Window のコンストラクタや Loaded イベント内で ReactivePropertyValue プロパティを書き換えると画面上での UI の検証エラーの表示と ReactiveProperty の検証エラーの状態に不整合が起きていました。(ReactiveProperty には検証エラーではない値が入っている状態でも画面上に赤枠が表示される。)
ReactivePropertyWpfScheduler を使用すると、この問題に対応できます。

WPF プロジェクトの App クラスの Startup イベントで以下のように初期化をしてください。

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using Reactive.Bindings;
using Reactive.Bindings.Schedulers;

namespace WpfApp1
{
    public partial class App : Application
    {
        private void Application_Startup(object sender, StartupEventArgs e)
        {
            ReactivePropertyScheduler.SetDefault(new ReactivePropertyWpfScheduler(Dispatcher));
        }
    }
}

まとめ

ということで、直近の更新内容を纏めました。ソースコードは GitHub から確認してください。Issue なども GitHub にお願いします。

https://github.com/runceel/ReactiveProperty

プロジェクトへの導入には NuGet をご利用ください。

https://www.nuget.org/packages/ReactiveProperty/

今回の WPF 用のスケジューラーは ReactiveProperty.WPF パッケージにあります。

https://www.nuget.org/packages/ReactiveProperty.WPF/

Microsoft (有志)

Discussion