2012年12月4日火曜日

TextBlock で TextChanged ?

TextBlock には TextBox のような TextChanged イベントがありませんが、同様なイベントを発生させることができます。
バインドの設定で、Binding.NotifyOnTargetUpdated プロパティを true にすると、バインディングターゲットの値が更新されたときに、TargetUpdated イベントが発生します。
TargetUpdated イベントの引数 DataTransferEventArgs の Property プロパティで、どのプロパティの値が更新されたかがわかります。

サンプルでは、ボタンをクリックするとバインディングソースの値を1加算し、TargetUpdated イベントの処理でメッセージボックスを表示します。

MainWindow.xaml

<Window x:Class="BindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="200" Width="300">
    <StackPanel>
        <TextBlock Name="textBlock1" Text="{Binding Path=Count, NotifyOnTargetUpdated=True}" 
                   TargetUpdated="textBlock1_TargetUpdated" />
        <Button Click="Button_Click">バインディングソースの値を変更</Button>
    </StackPanel>
</Window>

MainWindow.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace BindingTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new Class1();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Class1 class1 = (Class1)this.DataContext;
            class1.Count++;
        }

        private void textBlock1_TargetUpdated(object sender, DataTransferEventArgs e)
        {
            if (e.Property == TextBlock.TextProperty)
            {
                MessageBox.Show("カウント:"+ this.textBlock1.Text);
            }
        }
    }
}

Class1.cs

using System.ComponentModel;

namespace BindingTest
{
    public class Class1 : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        private int count;
        public int Count
        {
            get { return this.count; }
            set
            {
                if (value != this.count)
                {
                    this.count = value;
                    NotifyPropertyChanged("Count");
                }
            }
        }
    }
}


0 件のコメント:

コメントを投稿