0

私はMVVM/WPFを使用していて、一見単純なことをしようとしていますが、きれいな解決策が見つかりません。

私は次のことをしたい:

モデルでプロパティが変更された場合 (この場合、WPF Textbox テキストが変更されます)、メソッドを使用して、バインドされたプロパティに関連する UI で他の操作を実行します。

現在、ツールチップでマルチバインディングを使用しています(テキストボックスのデータコンテキスト+バインディングパスを取得するため)が、これはちょっとしたハックです。

<TextBox x:Name="textBox" Text="{Binding Model.MyProperty}">
 <TextBox.ToolTip>
        <MultiBinding Converter="{StaticResource brNewMultiConverter}">
                <!-- This to trigger the converter in all required cases. 
                     Without it, i cant get the event to fire when filling 
                     the model initially 
                 -->
                <Binding ElementName="textBox" Path="Text" />
                <!-- This has the properties i need, but wont fire without 
                     the binding above -->
                <Binding ElementName="textBox" />
        </MultiBinding>
 </TextBox.ToolTip>
</TextBox>

何かを再利用可能にして、おそらく別のコントロールにしたいので、 textchanged イベントを使用しているだけではありません。

誰かが私を正しい方向に向けることができれば、それは大歓迎です。

4

2 に答える 2

1

OK、マルチバインディングに関しては、そこで何を達成しようとしていますか?コンバーターが何をするのかわかりませんが、IValueConverter実装クラスでは実行できませんか?そうではないと思いますが、テキストボックスをコンバーターに渡しているようです。

モデルのプロパティが更新されたときにメソッドにいくつかのことを実行させる限り、ビューモデルにモデルクラスのイベントをサブスクライブさせることができます。オブジェクトWithEvents(VB.NET)を宣言し、On[PropertyName]Changedのイベントハンドラーを追加するだけです。

MVVMを実装するとき、私はコードビハインドを二級市民として扱う傾向があります。可能であれば、すべてのロジックをViewModelまたはViewにプッシュするように最善を尽くします。そのロジックの多くはViewModelsで複製できるため、Convertersの使用をほぼ完全に停止しました。再利用したい場合は、通常、渡されたものを取得して何かを実行する小さなヘルパークラスがあります。それを元に戻します。IValueConverterとこれほど素晴らしい関係を築いたことはありません...

それ以外は、あなたが何をしようとしているのか正確にはわかりません。もう少し説明してもらえますか?

于 2011-07-19T22:45:54.083 に答える
0

ツールチップにテキストボックスのコンテンツを表示させようとしているように見えます。

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyProperty}"/>

それがあなたが望むものではなく、テキストボックスの値に基づいてツールチップを変更したい場合は、ビューモデルでそれを行います。

public class MyViewModel
{
  string _MyProperty;
  public string MyProperty
  {
    get { return _MyProperty;}
    set 
    { 
       _MyProperty = value; 
       OnPropertyChanged("MyProperty");
       OnPropertyChanged("MyToolTipProperty"); //force WPF to get the value of MyToolTipProperty
    }
  }

  public string MyToolTipProperty
  {
    get 
    { 
      //return what you want
    }

  }
}

そして、あなたのマークアップで:

<TextBox Text="{Binding Model.MyProperty}" ToolTip="{Binding Model.MyToolTipProperty}"/>
于 2011-07-20T12:49:06.777 に答える