2011-06-28 9 views
0

xamlの各セルに長方形のグリッドがあります。私は各矩形の塗りつぶしをViewModelのプロパティにバインドできますが、代わりにViewModelのメソッドに各矩形の塗りつぶしをバインドし、矩形のx座標とy座標を渡して、塗りつぶしを戻します(これは実行時に変更することができます)。メソッドにプロパティをデータバインドしてパラメータを渡すにはどうすればよいですか?

これを行う簡単な方法はありますか?メソッドが特定のx座標とy座標のために返す塗りつぶしを変更するときに、メソッドがその値を更新したことをビューがどのように知っているからでしょうか?

私が直面している問題は、ViewModelはViewのUIコントロールについて知らないので、四角形の塗りつぶしの色を直接変更することはできません。また、グリッドが大きくなる可能性があるため、各矩形に対して別のプロパティを設定することはできません。

答えて

0

あなたはこのためIValueConverterを使用して試みることができる:

[ValueConversion(typeof (MyCoordObject), typeof (Brush))] 
public class CoordToBrushConverter : ConverterExtension 
{ 
    public override object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var coordObject= (MyCoordObject) value; 

     if (coordObject.X == 132) return Brushes.Red; 
     //define your own brushes as StaticResource or something, this won't work 
     return Brushes.Black; 
    } 


    public override object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     //nothing 
     return value; 
    } 
} 

今、あなたはちょうどあなたがコンバータに渡したいどのオブジェクトを把握する必要があります。あなたが座標に含まれているオブジェクトを持っていない場合は、多分あなたはMultiValueConverterを使用して座標を制御から一つずつを渡すことができます

<my:CoordToBrushConverter x:key="myConverter"/> 
<TextBox BackgroundBrush={Binding myObj, Converter={StaticResource myConverter}} /> 

:このようなあなたのXAMLでこれを使用しますか?あなたはおそらくこれをうまく動作させるためにこれを使って遊ぶべきです。

コンバータを使用したくない場合は、MVVMフレームワークのいくつかが、メソッドへのバインディングをサポートしていると誤解されていない場合は、いつでもチェックアウトできます。
チェックCaliburn又はMVVMLight

HTH

+0

CoordObjectとは何ですか?これはどのように設定されますか? – ColinE

+0

カスタムオブジェクトまたは座標への参照。 CoordObjectは実際には存在しません。私は答えをより良く指定するように更新します。 – RoelF

0

は、メソッドを呼び出して、パラメータを渡すための方法として使用することができない結合します。これは、ビューとビューモデルの間で状態を同期するための単なるメカニズムです。

あなたの場合、塗りつぶしを決定するために、ビューモデルは四角形の座標を知る必要があります。したがって、各矩形に対して、ビューモデルはX, Y, Fillのプロパティを公開する必要があります。

ここで大きな問題は、ビューモデルにX &Y座標を指定する方法ですか?私はこれらの四角形が、それらの場所を指示する何らかの種類のコンテナ内にあると推測していますか?もしそうなら、私が考えることができる唯一のテクニックは、TransformToVisualを介して位置を計算するUIElementのアタッチされた動作を作成することです。例えば参照:

http://forums.silverlight.net/forums/p/12160/414862.aspx

これは、あなたのビューモデルにあなたのX & Yの値にバインドすることができます。

しかし、正直言って、ここでMVVMを稼働させるのに苦労しているのであれば、間違ったパターンでしょうか?

色付きの矩形で構成されたUIを構築するだけの場合は、ループで矩形を追加し、コードビハインドで色付けします。

キス(Keep It Simple Stupid!)

1

このシナリオでは機能しない可能性がありますが、ObjectDataProviderを使用してバインディングからメソッドを呼び出すことができます。ここでは簡単な例です:

<Window.Resources> 
    <local:StringToDoubleConverter x:Key="stringToDouble" /> 

    <local:MyObject x:Key="objInstance" /> 

    <ObjectDataProvider 
    x:Key="odp" 
    ObjectInstance="{StaticResource objInstance}" 
    ObjectMethod="MyMethod" 
    > 
    <ObjectDataProvider.MethodParameters> 
     <sys:Double>0</sys:Double> 
    </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 
</Window.Resources> 

は今、あなたのビュー内の要素は、テキストボックスをメソッドのパラメータにバインドすることができると言う:

<TextBox Text={Binding Source={StaticResource odp}, Path=MethodParameters[0], UpdateSourceTrigger=PropertyChanged, Converter={StaticResource stringToDouble}} /> 

メソッドの戻り値はその後、別の場所で結合に使用することができます。

<Label Content="{Binding Source={StaticResource odp}}" ContentStringFormat="Method returned: {0}" /> 

繰り返しますが、これはあなたのシナリオでは動作しないかもしれないが、それはメソッドにパラメータを渡す方法を説明し、XAMLで完全に戻り値を使用しません。詳細はこちらのリソースをご覧ください:http://bea.stollnitz.com/blog/?p=22

関連する問題