6

単純な依存関係プロパティ プロキシを作成しようとしています。カスタム コントロールを作成しました。これはファイル ピッカーで、テキスト ボックス (name: "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); }
}

これは機能しましたが、そのプロパティにバインドしようとすると例外がスローされました。それから私は次のようになりました:

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テキストボックスのプロパティが必要だとどこで指定しましたか?

その依存関係プロパティを単純にプロキシするために何が欠けていますか?

編集: ソリューションも機能し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: 答えを理解するのに問題がある他のすべての人のために、私は少しグラフィックを作りました

4

3 に答える 3

2

最初のアプローチは機能しません。なぜなら、プロパティはに対してのみ登録さTextBoxれ、別のクラスに参照を追加しても何も起こらないからです。

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

TextBox.TextProperty本当に呼び出しを再利用したい場合AddOwner

例えば

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

(このプロパティは として登録されていることに注意してください。その"Text"ため、既に行ったように、必要な名前で新しいプロパティを作成する必要があります。また、メタデータ フラグを設定して、デフォルトで双方向にバインドすることをお勧めします。としてのバインディング動作TextBox.Text。)

于 2012-06-11T15:04:11.280 に答える
1

このソリューションは少しトリッキーですが、うまくいきます。

このユーザー コントロールの場合:

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

そしてそのビューモデル:

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");
        }
    }
}

FilePicker コントロールの XAML:

<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>

FilePicker コントロールの分離コード:

public partial class FilePicker : UserControl
{
    public FilePicker()
    {
        InitializeComponent();
    }

    /* private PROXY DP*/
    private static readonly DependencyProperty TextProperty =
        TextBox.TextProperty.AddOwner(typeof(FilePicker));

    /* public DP that will fire getter/setter for private DP  */
    public static readonly DependencyProperty SelectedFilePathProperty =
        DependencyProperty.Register("SelectedFilePath", typeof(string), typeof(FilePicker), new PropertyMetadata(default(string)));

    public string SelectedFilePath
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }
}

魅力のように機能します。

于 2012-06-12T11:42:04.790 に答える
0

HBの答えを理解するのに問題があったので、内部で何が起こっているのかを理解するのに役立つ小さなグラフィックを作成しました。ここにあります;

ここに画像の説明を入力してください

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

于 2012-06-12T13:24:43.650 に答える