2013-02-05 6 views
6

への結合私はSongDescriptionというカスタムユーザーコントロールをしている: は、WPFユーザーコントロールのカスタムたDependencyProperty

<UserControl x:Class="DPTestAp.SongDescription" ...> 
    <Grid x:Name="LayoutRoot"> 
     <DockPanel Height="50"> 
      <TextBlock x:Name="title" Text="{Binding name}" Width="100" Height="30"/> 
      <TextBox x:Name="lyrics"/> 
     </DockPanel> 
    </Grid> 
</UserControl> 

は、私はそれにしたDependencyPropertyを追加しました:

public partial class SongDescription : UserControl 
{ 
    public static readonly DependencyProperty SongProperty = DependencyProperty.Register("Song", typeof(Song), typeof(SongDescription)); 

    public Song Song 
    { 
     get 
     { 
      return (Song)GetValue(SongProperty); 
     } 
     set 
     { 
      SetValue(SongProperty, value); 
      updateLyrics() 
     } 
    } 

    private void updateLyrics() 
    { 
     lyrics.Text = Song.lyrics; 
    } 

    public SongDescription() 
    { 
     InitializeComponent(); 
    } 
} 

質問です:どのようにこのSongPropertyに何かをバインドするには? は、私はこのような私のメインウィンドウでSongDescriptionを使用します。

<local:SongDescription x:Name="songDescription" Song="{Binding DataContext}"/> 

私は私のTextBox 歌詞ショーの歌詞を作ることはできません。

songDescription.DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" }; 

またはこのようなウィンドウ自体へ:

DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" }; 

私も歌資源作ると、このようSongPropertyにバインドしようとしたメインウィンドウでは、私はこのように、songDescriptionへのDataContextを設定しようとしました:

<Window.Resources> 
    <local:Song x:Key="res" name="Home" lyrics="Hold on, to me as we go"/> 
</Window.Resources> 
<Grid> 
    <local:SongDescription x:Name="songDescription" Song="{StaticResource res}"/> 
</Grid> 

何も助けられませんでした。 TextBlock タイトルは、曲名を正しくバインドします。しかし、私はupdateLyrics()メソッドを呼び出させることはできません。 (実際の生活では、このメソッドはより複雑なので、名前のようにバインディングを使用することはできません)。

ありがとうございました!

答えて

7

ええ、それは依存関係のプロパティを持っています。 決しては、依存関係のプロパティが自身で管理するテーブルにWPFによって格納されるため、アクセサーメソッド(get/set)内に検証コードを配置しません。このため、依存関係のプロパティを登録する必要があります。基本的には、各プロパティに関連付けられた値を格納するエントリがこのテーブルに作成され、 'GetValue'/'SetValue'を使用すると、このテーブルのエントリが更新されますWPFがどのようにデータバインディングを一般的に管理できるかに関係しています)。

しかし、実際のデータに直接アクセスできるため、WPFはプロパティアクセサーを完全にバイパスすることができます。アクセサーがデータに直接アクセスできるのはなぜですか?その代わりに、 'PropertyChanged'コールバック関数または検証を行うWPF認可済みメソッドを実装する必要がありますが、はあなたのアクセサで決してこれを実行しません

参照:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

+0

ありがとう、マスター! –

+0

ですが、 'PropertyChanged'コールバックです。共有関数なので、コントロールを更新することはできません! –

2

がsircodesalotの答えに加えて、あなたは歌詞のテキストボックスにバインドされていません。また、バインドしたソングはクラスであるため、「Path = Song.Lyrics」などのボックスに表示するプロパティのパスを完全に指定する必要があります。

もう1つ考慮すべきことは、依存関係のプロパティです。あなたのモードはデフォルトでオンエアになるので、テキストフィールドを編集可能にすることは、あなたがそれを変更しない限り、本当に駄目になります。

MVVMを使用している場合は、メインウィンドウのコンテキストをビューモデルに設定して、一致するSongプロパティをバインドする必要があります。