2016-09-16 10 views
-1

Converterを使用してXAML MVVMビューにプロパティを表示しています。コンバーターを使用してUIを更新すると、プロパティが更新されません。

<xctk:DoubleUpDown Value="{Binding CurrentIndex, Converter={StaticResource IndexToNumberConverter}} /> 

コードがプロパティを更新すると、IndexToNumberConverter.Convert(...)メソッドが呼び出され、期待どおりに実行されます。

UIからコントロールを更新すると、プロパティが更新されることが予想されます。 これは何が起こるかではありません。 代わりに、コントローラのCOnvertBackメソッドが呼び出され、プロパティ設定ツールは実行されません。

私は、コンバータの引数として自分のプロパティを渡して、コンバーターconvertBackメソッドを実装して適切なジョブを実行すると動作すると思います。 しかし、私はそれが進める正しい方法ではないことをかなり確信しています:)

私はUIコントロールを更新すると私のプロパティを更新する簡単な方法はありますか?

Thxです。

+0

データがビューモデルからビューに流れるときに変換が実行されます。 ConvertBackは、データがビューからモデルに流れるときに実行されます。双方向バインディングをサポートしたい場合は、両方を実装する必要があります。 ConvertBackメソッドは、ビューのデータをビューモデルの適切なデータに変換する必要があります。保存しないと、そのデータは保存されません。あなたがどちらかを示していないので、私はあなたの問題が何であるかについては言えません。 – Will

答えて

3

UIの変更をViewModelに反映させたい場合は、2つのバインディングが必要です。私はコントロールが何をしているのかわかりませんが、私はTextBoxでそれを表示します。

<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" /> 

Mode=TwoWayはバックのViewModelにUIで行った変更をトリガするために、このテキストボックスを有効にします。 TwoWayモードはTextBoxのデフォルトですが、デフォルトでコントロールで有効になっているかどうかはわかりません。

ValueConverterを使用する場合は、ConvertBackを実装する必要があります。既に説明したようなものです。もう一度、あなたのコードがどのように見えるか分かりませんが、このようなものはうまくいくでしょう。

public class IndexToNumberConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     int index = Convert.ToInt32(value); 
     switch(index) 
     { 
      case 0: 
       return "ZERO"; 
      case 10: 
       return "TEN"; 
      default: 
       return "OTHER"; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     string val = value.ToString(); 
     switch(val) 
     { 
      case "ZERO": 
       return 0; 
      case "TEN": 
       return 10; 
      default: 
       return -1; 
     } 
    } 
} 

次に、バウンドコントロールは次のようになります。

<TextBox Text="{Binding Title, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IndexToNumberConverter} }" /> 

あなただけあなたがMode=OneWayToSourceを指定する必要がUIからのViewModelにあることを結合したい場合。

私はこれが役立つことを願っています。そうでなければ、関連性の高いコードで質問を更新することをお勧めします。

+0

説明をありがとうBart :) –

+0

ようこそ! – Bart

-1

あなたの質問から、あなたがuiから設定している間にプロパティが変換されていないことがわかりました。私はあなたのプロパティにiPropertyChangeインターフェイスを実装していないという問題があると思います。そのため、影響を受ける値は更新されません。

+0

実際には、UIコントロールが更新されたときにバインドされたプロパティを更新する必要があります。まるでコンバータがないかのように。 しかし、私はコードがプロパティを更新するときに適用するコンバータが必要です。 –

+0

変換バックメソッドも使用する必要があります。あなたのビューモデルや、INotiFicationPropertyChanged Interfaceを実装する必要があるプロパティを作成した場所で、これと一緒に。 –

+0

プロパティのnotificatio.https://msdn.microsoft.com/en-us/library/ms743695(v = vs.110)のこのリンクを参照してください。aspx –

関連する問題