0

カスタム コントロールの依存関係プロパティを ViewModel のプロパティにバインドしようとしています。

カスタム コントロールは次のようになります。


    public partial class MyCustomControl : Canvas
    {
            //Dependency Property
            public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl));


            private VisualCollection controls;
            private TextBox textBox;

            public string Text
            {
                get { return textBox.Text; }
                set 
                {
                    SetValue(TextProperty, value);
                    textBox.Text = value;
                }
            }

            //Constructor
            public MyCustomControl ()
            {
                controls = new VisualCollection(this);
                InitializeComponent();

                textBox = new TextBox();
                textBox.ToolTip = "Start typing a value.";

                controls.Add(textBox);

                //Bind the property
                this.SetBinding(TextProperty, new Binding("Text") {Mode = BindingMode.TwoWay, Source = DataContext});
            }
   }

ビューモデルは次のようになります。


-------

public class MyCustomControlViewModel: ObservableObject
{
    private string _text;


    public string Text
    {
        get { return _text; }
        set { _text = value; RaisePropertyChanged("Text");}
    }
}

----------

「テキスト」プロパティのこのバインドは、何らかの理由で機能していません。

私がやろうとしているのは、実際の実装では、基になる ViewModel の Text プロパティを更新するときに、MyCustom Control の text プロパティを更新することです。

これに関するヘルプは大歓迎です。

4

3 に答える 3

1

いくつかの調査の後、最終的に自分のコードの問題を突き止めました。依存関係プロパティの基になるパブリック メンバーに新しいプロパティ値を実際に設定する静的イベント ハンドラーを作成することで、このコードが機能するようになりました。Dependency プロパティの宣言は次のようになります。

//Dependency Property
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MyCustomControl), new PropertyMetadata(null, OnTextChanged));

次に、プロパティを設定する静的メソッドを次のように定義します。

private static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyCustomControl myCustomControl = (MyCustomControl)d;
    myCustomControl.Text = (string) e.NewValue;
}

これは私が欠けていた唯一のものです。

乾杯

于 2012-10-10T15:39:27.847 に答える
0

代わりに、メンバーのTextBoxをTextPropertyにバインドする必要があります。Textプロパティのxamlでのバインディングは、コンストラクターで作成したものをオーバーライドすると確信しています。

于 2012-10-07T20:38:53.547 に答える
0

依存関係プロパティにバインドするだけ

<MyCustomControl Text="{Binding Path=Text}" />
于 2012-10-05T23:51:44.940 に答える