nuits.jp blog

C#, Xamarin, WPFを中心に書いています。Microsoft MVP for Visual Studio and Development Technologies。なお掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Prism 6.3の変更点 その1 Pris.Core

Prism 6.3がリリースされてからすでに2カ月。書こう書こうと思っていたのですが、後回しにしまくっていたのでここに変更点をまとめます。
for Xamarin.Formsの範囲が対象となります。

と、言っておきながら、本エントリーではWPFおよびUWPとも共通のPrism.Coreの変更点です。
なお変更点の詳細は、次の記事と実際のソースの変更に基づいています。

http://brianlagunas.com/prism-6-3-release/
https://github.com/PrismLibrary/Prism/wiki/Release-Notes-6.3.0

変更点は、つぎのとおりです。

【破壊的変更】DelegateCommand.FromAsyncHandlerの削除

DelegateCommandにはExecute実行時に発生した例外が握りつぶされ通知されない問題がありました。
これの原因がDelegateCommand.FromAsyncHandlerの存在だったため、破棄されています。

DelegateCommandから非同期処理を呼び出い場合は次のいずれかが今後は推奨されます。

DelegateCommand myCommand = new DelegateCommand(async () => await MyHandler());

private Task MyHandler()
{
    //your code here
}

イベントハンドラであればこちら。

DelegateCommand myCommand = new DelegateCommand(MyHandler);
private async void MyHandler()
{
    //your code here
}

ただし、いずれであっても非同期処理中に例外が発生した場合、例外発生スレッドの中に閉じて例外処理をする必要がある点に気を付けてください。(別にPrismに限った話ではなくasync void全般の話ですが)
非同期処理内でハンドリングされなかった例外は紛失します。

【破壊的変更】型引数のないDelegateCommandのObservesCanExecuteの変更

型引数の無いObservesCanExecuteの引数はFunc<T, bool>でしたが、Func<bool>に変更されました。
元々、型引数の無いDelegateCommandの上記Tには、Commandの定義されているViewModelのインスタンスそのものが渡されてきており、本来は不要なため(thisと同じ)削除されたようです。

【破壊的変更】DelegateCommandBaseのAPIシグニチャの変更

DelegateCommandのExecuteとCanExecuteをoverrideしたサブクラスを作成していた場合に、シグニチャの変更によりビルドエラーとなります。
ただし、元々DelegateCommandのExecuteメソッドはoverrideしても正常に動作しない不具合があったようで、実害がある人はいないはずです。
その不具合の修正の為にシグニチャが変更されました。

型引数を持たないPubSubEventクラスの追加

PrismではObservableパターンを実装するためのPubSubEventクラスが提供されていましたが、これまでは型引数が必須でした。
しかし、何らかのイベントが発生したことのみを通知すればよく、引数が不要なケースもあるため、型引数を持たないクラスが追加されました。

BindableBaseにRaisePropertyChangedの追加

新しくRaisePropertyChangedが追加されました。
役割としてはこれまで存在したOnPropertyChangedと同等です。
今後、OnPropertyChangedを該当メソッドに名称変更するための、経過措置です。
とはいえ、通常はSetPropertyメソッドを利用していると思いますので、あまり影響はないでしょう。

BindableBaseのOnPropertyChangedへObsolete属性の追加

前述のとおり、RaisePropertyChangedへの名称変更に向けた経過措置として、6.3で非推奨となりました。

Prism.Coreについては以上です。