2011-08-11 8 views
1

ViewModelにバインドする必要がある、Viewに計算されたプロパティがあります。私はWPFを使用していると、自己計算するバインド可能なプロパティ(依存プロパティ)を作成する方法がないようです。ビューの状態が時間を要するために変化するたびに計算を実行する必要はありません。私はViewModelが結果を必要とするとき、すなわちそれが閉じるときに計算をしたい。ViewModelは、ビューから必要なデータを要求する方法を教えてください。

+0

コードを入力してください。 –

+1

あなたのViewModelにはどのような種類のデータが必要ですか? ViewModelsはViewについて何も知る必要がないので、達成しようとしているものの代替案があると思います。 – Rachel

+0

@Rachel、暗号化されたアカウント情報。 – Jordan

答えて

2

は、上記のあなたのコメントに基づいて、私は、暗号化されたデータが含まれますConverter

あなたのViewModelを使用して、ビューへの結合は読みやすい何かに変換コンバータを使用していますでしょう。データをViewModelに保存するときは、コンバータのConvertBackメソッドを使用してデータを再度暗号化します。

<TextBox Text="{Binding EncryptedAccountNumber, 
     Converter={StaticResource DecryptTextConverter}}" /> 
public class DecryptTextConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Implement decryption code here 
     return decryptedValue; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     // Implement encryption code here 
     return ecryptedValue; 
    } 
} 

暗号化コードは、時間がかかる場合は、ごUpdateSourceTrigger=Explicitを設定し、手動で保存]ボタンをクリックしたときに、ソースの更新をトリガします。

+0

純粋なMVVMで私がやっているとは思えません。私はそのように始めた。まれな使用例では、ユーザーからの入力を集計し、集計されたデータをすべてではなくビュー・モデルに戻すユーザー・コントロールを設計しました。これらの状況はまれであり、すべてセキュリティを処理します。これはおそらく最良の答えですので、私はそれを答えとしてマークしますが、実際には私の問題には合致しません。 *一息*私はまだWindowsフォーム/ 2つの層の考え方にこだわっています。 – Jordan

+0

また、複数のフィールドが暗号化されています(かなり重い)。 – Jordan

+0

私は顧客のセキュリティに関して言えば、(特定のモジュール内の)「SecureStrings」が全面的に見ています。 – Jordan

0

これは私のソリューションです。 ICommandと同じように動作しますが、ビューはデリゲート(CalculationDelegate)を提供し、ビューモデルはCanExecuteExecuteを呼び出します。その純粋でないMVVMが動作します。

public interface ICalculationProvider<TResult> 
{ 
    event EventHandler CanExecuteChanged; 

    Func<TResult> CalculationDelegate { get; set; } 

    bool CanExecute(); 
    TResult Execute(); 
    bool TryExecute(out TResult a_result); 
} 

ここで私がやっていることは純粋なMVVMではないので、レイチェルの答えは正しいとマークしています。

関連する問題