0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【備忘録】MvvmToolkitでえらい目をみた件について

0
Posted at

概略

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はもうこりごりだ~~~(二度と使わん)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?