スキップしてメイン コンテンツに移動

.NET MAUI INotifyPropertyChangedではまった話

INotifyPropertyChangedではまった

のでその備忘録として
まあ言われてみればその通りなんだけどさ・・・
 

何に嵌まった

画面のプロパティをバインドするのに便利だぜと思っていたが、
その画面に遷移したとき、画面のプロパティを直接いじってはダメ
ということ
それを知らないでやったら、INotifyPropertyChangedがそれ以降効かなくなった
 

間違ったコード

ビューモデルのソースを作成

まあタイマーを1秒ごとに起動してイベントあげるだけ
public class ViewModelsBase : INotifyPropertyChanged
{
    System.Timers.Timer timer = new System.Timers.Timer();
    private bool _isTimerPlus = false;
    private int _timerCount = 0;

    public ViewModelsBase()
    {
        timer.Interval = 1000;
        timer.Elapsed += ViewModelsBase_OnTimer;
        timer.Start();
    }

    public bool IsTimerPlus
    {
        get => _isTimerPlus;
        set
        {
            _isTimerPlus = value;
            OnPropertyChanged();
        }
    }

    private void ViewModelsBase_OnTimer(object? sender, ElapsedEventArgs e)
    {
        IsTimerPlus = !IsTimerPlus;
    }

    /// <summary>
    /// プロパティ変更通知
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// プロパティ変更通知
    /// </summary>
    /// <param name="propertyName"></param>
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
 

上のソースを継承して1秒ごとにその時刻を文字列として書き込む

class ViewModels2:ViewModelsBase
{
    public ViewModels2()
    {
        PropertyChanged += ViewModels2_PropertyChanged;
    }

    private string _text = "Hello, World!";
    public string TextHello
    {
        get => _text;
        set
        { _text = value; OnPropertyChanged(); }
    }
           

    private void ViewModels2_PropertyChanged(object? sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == nameof(IsTimerPlus))
        {
            TextHello = DateTime.Now.ToString();
        }
    }
}
 

書き換えたいラベルを適当な画面に追加

            <Label
                x:Name="CounterLabel"
                Text="{Binding TextHello}"/>
 

BindContextに作ったviewModelクラスのインスタンスを設定だー

        private ViewModels2 _viewModel = new ViewModels2();
        public MainPage()
        {
            InitializeComponent();
            BindingContext = _viewModel;
 
            CounterLabel.Text = "ほげげ";   // ★直接書き換えてはいけない
        }
はい。これで二度と_viewModelでイベントが発生しても画面が変化しなくなりました
 
正しくは、ConterLabel.Textを書き換えるのではなく
            _viewModel.TextHello = "ほげげ";// ★ViewModelを介して書き換える
_viewModel.TextHelloの方を書き換えます
 
いや、全然書き換わらなくなっちゃって焦ったわ
 
おしまい
 

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13 ...

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな