明示的に実装されたインターフェースメンバにバインディングする
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>
トラックバック
- このエントリーにトラックバック:
- http://frog.raindrop.jp/cgi-bin/mt/mt-tb.cgi/2270
コメント