3

Canvasバインディングを介して DependencyProperty に渡される値を指定して、ライブ ダイアグラムをプロットする から派生したコントロールを作成しました。簡略化されたバージョンは次のとおりです。

public class Plotter : Canvas
{
    public float Value { get { return (float)GetValue(ValueProperty); } set { SetValue(ValueProperty, value); } }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(float), typeof(Plotter),
        new PropertyMetadata(0f, new PropertyChangedCallback(ValueChangedCallBack)));

    public static void ValueChangedCallBack(DependencyObject property, DependencyPropertyChangedEventArgs args)
    {
        Plotter plotter = (Plotter)property;
        plotter.Value = (float)args.NewValue; //<-- Removed this line to get it to work

        // Actually draw the value into the canvas geometry
        plotter.PlotValue(plotter.Value);
    }
}

次のようにコントロールをバインドします。

<mystuff:Plotter Value="{Binding MyViewModelProperty}" Height="50" Width="200" />

私のViewModelは正しく実装INotifyPropertyChangedして呼び出します。PropertyChangedテキストボックスにバインドするMyViewModelPropertyと、毎回正しく更新されます。自分のコントロールにバインドした場合にのみ、 myValueChangedCallBackはページが読み込まれるときに一度だけ呼び出され、その後は呼び出されません。

ここには何が表示されていませんか? 助けてくれてありがとう!

解決済み:Valueコールバックで明示的に設定する必要はありません。

4

3 に答える 3

5

プロパティ値の変更のコールバックでプロパティ値を設定します。いずれにせよ、それはあまり意味がありません。しかし、そのローカルに設定された値がバインド値をオーバーライドし、バインディングが依存関係プロパティに設定されなくなっているのでしょうか?

于 2012-04-13T11:01:48.480 に答える
1

DependencyProperty.RegisterAttached の代わりに DependencyProperty.Register を使用しないでください。

于 2012-04-13T10:58:25.867 に答える
1

バインディングのモードを TwoWay に設定する必要がありますか?

于 2012-04-13T10:55:56.253 に答える