1

現在、パネルが再描画されるたびに、valueconverter でデータの再スケーリングを行っています。ほとんどの処理は、コントロールのサイズまたは他のいくつかのプロパティが変更された場合にのみ発生するため、この処理の一部をビューモデルに移動したいと考えています。

再スケーリングされたデータが適切に見えるようにするにActualWidthは、viewmodel のコンテナーが必要です。ビューモデルのプロパティに一方向にバインドしたいので、変更されたときに再スケーリング処理をトリガーできます。

私が見つけることができるすべての例は、他の方法ではなく、CLR または依存関係プロパティを要素にバインドします。どうすればよいかを理解するために、明らかに何かが欠けています。バインディングを設定するためにいくつかの異なることを試しましたが、うまくいきません。

ヒントはありますか?ありがとう。

MyView XAML では:

<myItemsControl/>

MyView のコード ビハインドでは、次のようなものです。

Binding b = new Binding(MyWidthProperty);
b.Mode = BindingMode.OneWay;
b.Source = myItemsControl.Name;
.........?

public static readonly DependencyProperty MyWidthProperty = 
DependencyProperty.Register( "MyWidth", typeof(Double), typeof(MyViewModel));

MyViewModel で:

    public Double MyWidth{
        get { return _myWidth; }
        set { _myWidth = value; ViewChanged(this); } }
4

1 に答える 1

2

このようにすることはできません。a は読み取り専用であるBindingため、 に設定できません。ActualWidth

へのバインディングのみを設定できますMyWidth。ただし、このためには、最初に MyWidth を に変換する必要がありますDependencyProperty。次に、次のようなことができるようになります

Binding b = new Binding("ActualWidth") { Source = myItemsControl };
this.SetBinding(MyViewModel.MyWidthProperty, b);

依存関係プロパティに変換するには、 の定義をMyWidth次のように置き換える必要があります。

public static readonly DependencyProperty MyWidthProperty =
    DependencyProperty.Register("MyWidth", typeof(double), typeof(MyViewModel),
                                        new UIPropertyMetadata(
                                            0.0,
                                            (d, e) =>
                                            {
                                                var self = (MyViewModel)d;
                                                ViewChanged(self);
                                            }));

ただし、依存関係のプロパティには注意してください。最初にドキュメントを読むことをお勧めします。

編集:次のようにプロパティを定義する必要もあります。

public double MyWidth
{
    get { return (double)this.GetValue(MyWidthProperty); }
    set { this.SetValue(MyWidthProperty, value); } 
}
于 2010-11-15T17:15:17.020 に答える