2012-06-11 11 views
6

単純な依存関係プロパティプロキシを作成しようとしています。私はカスタムコントロールを作った、それはテキストボックス(名前:"TextBox_FilePath")と開いているファイルのダイアログを示すボタンから作られているファイルピッカーです。依存関係プロパティのプロキシを作成する

私は再利用可能なコントロールを作っているので、"SelectedFilePath"プロパティを持っているといいと思います。 Textプロパティは"SelectedFilePath"プロパティであることが私のコントロールには完璧であると思われるので、これらの依存関係プロパティをプロキシしたいと思います。

私が作った最初のアプローチは:

public static readonly DependencyProperty SelectedFilePathProperty = TextBox.TextProperty; 

public string SelectedFilePath 
{ 
    get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

働いたが、そのプロパティにバインドしようとしたときに、例外をthrowedいます。それから、私は外に出ました:

public static readonly DependencyProperty SelectedFilePathProperty = 
    DependencyProperty.Register("SelectedFilePath", typeof (string), typeof (FilePicker), new PropertyMetadata(default(string))); 

public string SelectedFilePath 
{ 
    get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

これはうまくいきますが、私はなぜ分かりませんか?どこで指定しましたか?テキストボックスのtextプロパティが必要でしたか?

この依存関係プロパティをプロキシするだけで何が失われますか?

EDIT:AddOwner ソリューションは、あまりにも動作しません、それは「結合のみ依存関係プロパティに適用することができます」と言ってExcetionをスローします。コード:

public static readonly DependencyProperty SelectedFilePathProperty = 
    TextBox.TextProperty.AddOwner(typeof(FilePicker)); 

public string SelectedFilePath 
{ 
    get { return (string)this.TextBox_FilePath.GetValue(SelectedFilePathProperty); } 
    set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); } 
} 

わかりません。

EDIT2: 他のみんなが答えを理解する問題を持つためのプロパティが別での参照を追加し、唯一TextBoxためが登録されているので、私は最初のアプローチは動作しませんa little graphic

答えて

3

を作りましたクラスは何もしません。

もう1つは、まったく新しい文字列プロパティを作成するだけです。

TextBox.TextPropertyAddOwnerを実際に再利用したい場合は、

public static readonly DependencyProperty SelectedFilePathProperty = 
    TextBox.TextProperty.AddOwner(typeof(FilePicker)); 

(既に行ったように、あなたはおそらくあなたがしたい名前で新しいプロパティを作成する必要がありますので、あなたが持っているしたい場合、私はまたbind two-way by defaultset metadata flagsに推薦する。、このプロパティは"Text"として登録されていることに注意してくださいTextBox.Textと同じ結合挙動を示す。

+0

私の編集を参照してください:) – GameScripting

+0

*私は*、それは名前「テキスト」に登録されています言ったように、あなたはそれ故にだけと呼ばれるプロパティにバインドすることができます'Text'、あなたが作成した' SelectedFilePath'プロパティは、あなたの命令コードの便宜のための単なるラッパーです。バインディングは決してそれを使用しません。別の名前が必要な場合は、自分のプロパティを登録してください。 –

+0

あなたはとても親切で、例を挙げたり、それをどうやって参考にすることができますか? – GameScripting

1

この解決法はややこしい。このユーザーコントロールを考えると

<Grid> 
    <StackPanel> 
     <WpfApplication1:FilePicker SelectedFilePath ="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <TextBlock Text="{Binding MyProperty}" /> 
    </StackPanel> 
</Grid> 

とそののviewmodel:FilePicker制御用

public class MainWindowViewModel : INotifyPropertyChanged 
{ 
    #region Implementation of INotifyPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(string e) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(e)); 
    } 

    #endregion 

    private string _myProperty; 
    public string MyProperty 
    { 
     get { return _myProperty; } 
     set 
     { 
      _myProperty = value; 
      OnPropertyChanged("MyProperty"); 
     } 
    } 
} 

XAML:

:FilePicker制御用

<Grid> 
    <TextBox x:Name="TextBox_FilePath" DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type WpfApplication1:FilePicker}}}" Text="{Binding SelectedFilePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 

分離コード

魅力的な作品です。

+0

完全なGistはここにあります:https://gist.github.com/2917066 –

+0

ありがとう、あなたの例がなければ、私はそれを動作させることはありません! – GameScripting

0

私は問題を理解していたので、H.B.s answer私はボンネットの下で何が起こっているのか理解するのを助けた小さなグラフィックを作った。ここにあります;

enter image description here

多分それは他の誰かを助け:)

+0

今私はそれがあなたが得なかったことを得る:P –

関連する問題