概略
MvvmToolkit8.3以降を使用する場合、プロパティの方を記述する。
[ObservalProperty]
public partial string? Name {get; set;}
でもなんかおかしくなるっぽい
本記事はClaudeの出力結果を含みます。
環境
.NET 8 / SDK 10.0.100
CommunityToolkit.Mvvm 8.4.2
WinUI 3 (net8.0-windows10.0.19041.0)
Visual Studio 2022
本文
問題
ふとWinUIを全然触ってない事に気づいて試しに使ってみる事にしました。なんで使ってないかと言えばホットリロードのシステムが壊滅的に自動コーディングに問題をきたすのがすごく困ってたからなんですが、慣れたらうまいこと言ったので気持ちよく書いてました。
ロジックも書けて大まかなViewも作成できたのでいざMVVMパターンでがっちり書こうと思いMvvmToolkitをいそいそとインストールしてゴリゴリ書いたところ、何故かプロパティをIDEが認識しない。
ビルドしてないから?と思いビルドしたところ、流れてくる無数のエラーコード。
The field TestProject.MainViewModel.data is annotated with [ObservableProperty] and should not be directly referenced (use the generated property instead) (https://aka.ms/mvvmtoolkit/errors/mvvmtk0034)
The field TestProject.MainViewModel.data using [ObservableProperty] will generate code that is not AOT compatible in WinRT scenarios (such as UWP XAML and WinUI 3 apps), and a partial property should be used instead (as it allows the CsWinRT generators to correctly produce the necessary WinRT marshalling code) (https://aka.ms/mvvmtoolkit/errors/mvvmtk0045)
[ObservableProperty]
private BindingList<string> data = [];
どういうことなの…
原因
リンク(mvvmtk0045)にあるように、MvvmToolkitはVersion8.3以降から書き方が変わっているみたいです。
従来
[ObservableProperty]
private string? _name;
// Nameプロパティが作成される
MvvmToolkit8.3以降
[ObservableProperty]
public partial string? Name {get; set;}
// 内部的にフィールドが作成される。
このため、not AOT compatible、事前コンパイルとの互換性がない書き方をしたからうまくいかなかったわけなんですね。
備考:追加の問題
しかし、リファレンスの通りに書いたところさらなる問題が発生。IntelliSenseからこんなエラーが。
CS9248 部分プロパティ 'MainViewModel.Data' には実装パーツが必要です。
無情にも引かれる赤波線。
ふと気になって調べてみるとアナライザーのGeneratedSource内に作成されたソースファイルすら存在しない。
csprojに
<LangVersion>preview</LangVersion>
を書くといいよみたいなことをいわれようにも特に変化なし。
度重なるクリーン>ビルドに唸るPC。
しかし何故かビルドは通るし普通に動く。わけがわからないでちゅ(幼児退行)
色々限界になり涙目でClaudeにぶん投げたところ、
ぼく:IntelliSense上のエラーは表示されっぱなしだけどビルドそのものは通りました。なんで?(半ギレ)
Claudeくん:ソースジェネレーターはビルド時に実行されるため、IntelliSenseがリアルタイムで追いつかないことは構造上よくある。ビルドが通るなら**誤検知(false positive)**として扱ってよい。
(内容は要約)
Claudeくん迫真の無視しろという圧。
仕方がないので赤波線を見ながら作成を続けることに…
トホホ~~~WinUIはもうこりごりだ~~~(二度と使わん)