えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

WPF の Binding の Converter が減る方向へ

Kazuki さんの Blog を補足します。
http://blogs.wankuma.com/kazuki/archive/2009/05/28/173774.aspx

WPF の Binding は TextBox に入力があってフォーカスが離れると property の set を呼びますが、
その時の INotifyPropertyChanged でのイベントには反応しません。

Binding.Converter プロパティ などがセットされていて property の 値と、
表示が変わってくるかもしれない時には INotifyPropertyChanged でのイベントに反応します。

つまり、property の set と TextBox 表示が変わる場合は Converter をつけるのが本来の形なのです。
これによって通常の場合は無駄な INotifyPropertyChanged でのイベントを無視できて処理が削減できるから反応が良くなるというわけです。

以下に例を挙げます。これならVS2008でWPFアプリケーションでも動作します。
今回 Vs2010では いちいち IValueConverter を作らせるのは手間だろうということで Converter をつけなくてもできるように配慮したようです。

using System.ComponentModel;

namespace TextBoxBindings
{
    public class Person : INotifyPropertyChanged
    {
        #region INotifyPropertyChanged メンバ

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        #endregion

        private string _name;
        public string Name
        {
            get { return _name; }
            set
            {
                _name = value;
                // 名前は大文字なのです
                if (!string.IsNullOrEmpty(_name))
                {
                    _name = _name.ToUpper();
                }
                OnPropertyChanged("Name");
            }
        }
    }
}

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

namespace TextBoxBindings
{
    class ToUpperConverter : IValueConverter
    {
        #region IValueConverter メンバ

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is string)
            {
      //この場合は必要ないが・・・
                return ((string) value).ToUpper();
            }
            return DependencyProperty.UnsetValue;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value;
        }

        #endregion
    }
}

<Window x:Class="TextBoxBindings.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TextBoxBindings"
    Title="Window1" Height="107" Width="300">
  <Window.Resources>
    <local:ToUpperConverter x:Key="ToUpperConverter"/>
  </Window.Resources>
  <Window.DataContext>
    <local:Person />
  </Window.DataContext>
  <StackPanel>
    <TextBox Text="{Binding Path=Name, Converter={StaticResource ToUpperConverter}}" />
    <Button Content="Dummy" />
  </StackPanel>
</Window>

投稿日時 : 2009年5月29日 0:36