TextBlock をデータバインディングする方法について記載します。
[概要]
まずは基本的な例を記載します。XAML中の TextBlock からデータバインディングする例です。
[環境]
[静止画例]
[動画例]
[プログラムソース "MainWindow.xaml"]
<Window x:Class="TextBlock.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TextBlock"
mc:Ignorable="d"
Title="MainWindow" Height="225.727" Width="347.545" ResizeMode="NoResize">
<Grid>
<TextBlock x:Name="TextBlock" Text="{Binding Path=textData.Text, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="32,30,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/>
<Button x:Name="btnTextChange1" Content=""test1"" Margin="0,31,10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="75" Click="BtnTextChange1_Click"/>
<Button x:Name="btnTextChange2" Content=""test2"" Margin="0,69,10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="75" Click="BtnTextChange2_Click"/>
<Button x:Name="btnQuit" Content="終了" Margin="0,0,10,10" RenderTransformOrigin="0.707,-0.15" HorizontalAlignment="Right" Width="75" Height="20" VerticalAlignment="Bottom" Click="BtnQuit_Click"/>
</Grid>
</Window>
[プログラムソース "MainWindow.xaml.cs"]
using System.Windows; using System.ComponentModel; // INotifyPropertyChanged namespace TextBlock { public partial class MainWindow : Window { private TextData _textData = new TextData(); public MainWindow() { InitializeComponent(); DataContext = new { textData = _textData, }; } private void BtnQuit_Click(object sender, RoutedEventArgs e) { Close(); } private void BtnTextChange1_Click(object sender, RoutedEventArgs e) { _textData.Text = "test1"; } private void BtnTextChange2_Click(object sender, RoutedEventArgs e) { _textData.Text = "test2"; } } public class TextData : INotifyPropertyChanged { private string _text = "初期値"; public string Text { get { return _text; } set { _text = value; NotifyPropertyChanged("Text"); } } #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; void NotifyPropertyChanged(string info) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(info)); } } #endregion // INotifyPropertyChanged } }
サンプルプログラム ダウンロード
同じ内容を今度は MVVM (Model-View-ViewModel) で作成してみます。
実行結果は全く同じなので省略。
[ViewModelBase.cs]
ViewModel の基本クラス (ViewModelBase) の実装です。
using System.ComponentModel; // INotifyPropertyChanged using System.Runtime.CompilerServices; // CallerMemberName: .net Framework 4.5 以降 namespace TextBlockMvvm { class ViewModelBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } }
[DelegateCommand.cs]
DelegateCommand の実装です。
using System; using System.Windows.Input; // ICommand namespace TextBlockMvvm { class DelegateCommand : ICommand { public event EventHandler CanExecuteChanged; private readonly Action _execute; private readonly Func<bool> _canExecute; public DelegateCommand(Action execute) : this(execute, () => true) { } public DelegateCommand(Action execute, Func<bool> canExecute) { this._execute = execute; this._canExecute = canExecute; } public void Execute(object parameter) { this._execute(); } public bool CanExecute(object parameter) { return this._canExecute(); } public void RaiseCanExecuteChanged() { CanExecuteChanged?.Invoke(this, EventArgs.Empty); } } }
[MainWindowViewModel.cs]
アプリの ViewModel の実装です。
using System.Windows.Input; // ICommand namespace TextBlockMvvm { class MainWindowViewModel : ViewModelBase { private string _text = "初期値"; private MainWindow _mwnd; public ICommand QuitCommand { get; private set; } public ICommand ChangeTextType1Command { get; private set; } public ICommand ChangeTextType2Command { get; private set; } public string TextSample { set { _text = value; OnPropertyChanged(); } get { return _text; } } public MainWindowViewModel() : this(null) { } public MainWindowViewModel(MainWindow mwnd) { _mwnd = mwnd; this.QuitCommand = new DelegateCommand(() => { _mwnd?.Close(); }); this.ChangeTextType1Command = new DelegateCommand(() => { TextSample = "test1"; }); this.ChangeTextType2Command = new DelegateCommand(() => { TextSample = "test2"; }); } } }
[MainWindow.xaml]
アプリの View の実装です。
こちらでコメントアウトしている DataContext 部分を有効化して 後述の MainWindow() 中の
DataContext 部分をコメントアウトしても動作します。
ただしこの場合 [終了] ボタンをクリックしてもアプリを終了できなくなります。
<Window x:Class="TextBlockMvvm.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TextBlockMvvm" mc:Ignorable="d" Title="MainWindow" Height="225.727" Width="347.545" ResizeMode="NoResize"> <!--<Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext>--> <Grid> <TextBlock x:Name="TextBlock" Text="{Binding TextSample, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Left" Margin="32,30,0,0" TextWrapping="Wrap" VerticalAlignment="Top"/> <Button x:Name="btnTextChange1" Content=""test1"" Command="{Binding ChangeTextType1Command}" Margin="0,31,10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="75"/> <Button x:Name="btnTextChange2" Content=""test2"" Command="{Binding ChangeTextType2Command}" Margin="0,69,10,0" VerticalAlignment="Top" HorizontalAlignment="Right" Width="75"/> <Button x:Name="btnQuit" Content="終了" Command="{Binding QuitCommand}" Margin="0,0,10,10" RenderTransformOrigin="0.707,-0.15" HorizontalAlignment="Right" Width="75" Height="20" VerticalAlignment="Bottom"/> </Grid> </Window>
[MainWindow.xaml.cs]
new MainWindowViewModel() の引数に this を指定しているのは、MainWindowViewModel.cs 中で Close() を実行できるようにするために行っています。
using System.Windows; namespace TextBlockMvvm { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new MainWindowViewModel(this); } } }
サンプルプログラム ダウンロード
本ページの情報は、特記無い限り下記 MIT ライセンスで提供されます。
2022-10-13 | - | ページデザイン更新 |
2019-07-08 | - | 「2. MVVM(Model-View-ViewModel)で実装」を追加 |
2019-07-05 | - | 新規作成 |