はじめに
前回「バインディング」について学習しました。今回は「ViewModel」について学習します。前回同様「XAML」は書きません。
目標
ボタンを押したら写真が切り替わるWindowを作ってみたいと思います。今回は画像表示までです。ボタンクリックをViewModelで実装するのは今後の課題とします。
方法
ViewModel
using System.ComponentModel; using System.Runtime.CompilerServices; using System.Windows.Media.Imaging; namespace imageShow { class ViewModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private BitmapImage img; public BitmapImage Img { get { return img; } set { img = value; OnPropertyChanged(); } } protected void OnPropertyChanged([CallerMemberName] string name = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); } } }
Model
using System; using System.Windows; using System.Windows.Media.Imaging; namespace imageShow { public partial class MainWindow : Window { private ViewModel vm; BitmapImage first = new(new Uri(AppDomain.CurrentDomain.BaseDirectory + "/1.jpg")); BitmapImage second = new(new Uri(AppDomain.CurrentDomain.BaseDirectory + "/2.jpg")); int current_image = 1; public MainWindow() { InitializeComponent(); WindowSetting(); vm = new ViewModel(); DataContext = vm; vm.Img = first; } private void ChangeImage(object sender, RoutedEventArgs e) { current_image *= -1; if (current_image == 1) { vm.Img = first; } else { vm.Img = second; } } } }
View
using System.Windows; using System.Windows.Controls; namespace imageShow { public partial class MainWindow : Window { private void WindowSetting() { Grid mainGrid = Myfunc.newGrid("8,1", ""); Content = mainGrid; Image imagePanel = new(); Grid.SetRow(imagePanel, 0); mainGrid.Children.Add(imagePanel); imagePanel.SetBinding(Image.SourceProperty, "Img"); Button changeImage = new() { Content = "Change Image" }; Grid.SetRow(changeImage, 1); mainGrid.Children.Add(changeImage); changeImage.Click += ChangeImage; } } }
「Myfunc.newGrid」についてはこちらを参照して下さい。
参考にさせて頂いたサイト
方法: プロパティの変更通知を実装する - WPF .NET Framework | Microsoft DocsVisualStudio2019 C#+OpenCV(C++版)でWPFアプリのバインディングで画像表示をしてみる【WPF+OpenCV画像表示1】 - こつこつエンジニア