< メインメソッドを自分で定義する | <elem xmlns=''> は指定できません。 >

December 19, 2008

明示的に実装されたインターフェースメンバにバインディングする

C# では、インターフェースを明示的に実装することができます。

たとえばこんなインターフェース

namespace SampleApp
{
    public interface IProfile
    {
        string Name { get; }
        DateTime BirthDay { get; }
    }
}

実装先で、インターフェース名をつけてメンバを定義します。この Window1 は IProfile にキャストしないと BirthDay は参照できません。また、Window1.Name と ((IProfile) Window1).Name は、戻される値が異なります。

namespace SampleApp
{
    /// <summary>
    /// Window1.xaml の相互作用ロジック
    /// </summary>
    public partial class Window1 : Window, IProfile
    {
        private DateTime birthDay;
        public Window1 ()
        {
            birthDay = DateTime.Now;
            InitializeComponent ();
        }

        #region IProfile メンバ

        string IProfile.Name
        {
            get { return this.GetType ().ToString (); }
        }

        DateTime IProfile.BirthDay
        {
            get { return birthDay; }
        }

        #endregion
    }
}

このプロパティにデータバインドする方法がわからなくてはまりました。XAML では、以下のように Path プロパティを丸括弧でくくって、インターフェース名.メンバ名として指定します。

<Window
    x:Name="OwnerWindow"
    x:Class="SampleApp.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:local="clr-namespace:SampleApp"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Column="0" Grid.Row="0" Text="なまえ: "/>
        <TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding ElementName=OwnerWindow, Path=(local:IProfile.Name)}"/>
        <TextBlock Grid.Column="0" Grid.Row="1" Text="たんじょうび: "/>
        <TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding ElementName=OwnerWindow, Path=(local:IProfile.BirthDay)}"/>
    </Grid>
</Window>
ExplicitImplemened.png

トラックバック

このエントリーにトラックバック:
http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2270

コメント

コメントする

※ コメントスパム対策のため、コメント本文はおはよう、こんにちわ、こんばんわのいずれかより始めるようにしてください。

name:
email:

※ 必要ですが、表示しません。

url:
情報を保存する ?