2011-01-12 4 views
0

同じフィールドにバインドされた複数のコントロールに問題があります。私は簡単な例で説明しましょう:複数のコントロールがSilverlight 4の同じフィールドにバインドされています

私は私のDataContextでこのクラスのインスタンスを持っている:

class X { string myVar; } 

myVarには、例えばのようなものが含まれ、合成変数である「42;バー」 は、私は2つを持っています私のSilverlightでmyVarを上に結合のTextBox:

<TextBox Text="{Binding myVar, Mode=TwoWay, Converter=XConverter}" /><!-- 42 --> 
<TextBox Text="{Binding myVar, Mode=TwoWay, Converter=YConverter}" /><!-- bar --> 

XConverterはYConverterがバーにmyVarに変換する方法を知っている42 にmyVarに変換する方法を知っています。

しかし、どのように変換できますか?たとえば42から43に変更した場合、43; barをどのように再作成できますか?コンバータでは、私はmyVarの以前の値を持っていないので。

私はクラスXにプロパティを追加したくありません(この例では、フィールドに2つのコントロールがバインドされていますが、実際はそれ以上です)。

ありがとうございます!

編集:TextChangedのようなハンドラを追加したくないので、私はそれを行うバインディング方法をしたいと思います。

答えて

1

XConverterとYConverter(ConvertBackメソッドが埋め込まれている)には、マルチバインドhttp://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/を使用します。

それぞれのXConverterとYConverterを両方のテキストボックスにバインドします。それから、XConverterでは、beforeの前に置き換えます。 YConverterは後に置き換えます。私はおそらく、クラスXの内部

のためのデコレータのクラスを利用することになる

0

、デコレータクラスは、画面にバインドすることができ、それぞれが別々の性質、にmyVarをを破ります。次に、Xオブジェクトをデコレータから戻すToX()メソッドがあります。このメソッドは、myVarプロパティの簡単な構築を行います。例は次のようなものです:

public class X 
{ 
    public string myVar { get; set; } 
} 

public class XDecorator 
{ 
    public XDecorator(X x) 
    { 
    var pieces = x.Split(';'); 
    XPart = pieces[0]; 
    YPart = pieces[1]; 
    } 


    public string XPart { get; set; } 
    public string YPart { get; set; } 

    public X ToX() 
    { 
    return new X { myVar = string.Format("{0};{1}", XPart, YPart) }; 
    } 
} 

あなたのViewModelにこのプロパティを設定しているときに、あなたが最初にこのデコレータのクラスでそれをラップします。それを保存するときは、ToX()メソッドを呼び出してXオブジェクトを取り出します。本当に必要なことです。 それは意味をなさないことを望みます。

関連する問題