Как ViewModel может запрашивать данные из представления, когда это необходимо? - PullRequest
1 голос
/ 11 августа 2011

У меня есть вычисляемое свойство в моем View, которое мне нужно привязать к моей ViewModel.Я использую WPF, и кажется, что нет никакого способа сделать привязываемое свойство (Dependency Property), которое само вычисляется.Я не хочу выполнять вычисления всякий раз, когда состояние View меняется, потому что они требуют много времени.Я хочу выполнять вычисления всякий раз, когда ViewModel нужен результат, то есть когда он закрывается.

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Исходя из вашего комментария выше, я бы использовал 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 голосов
/ 11 августа 2011

Это моё решение. Он работает так же, как ICommand, но представление предоставляет делегата (CalculationDelegate), а модель представления вызывает CanExecute и Execute. Это не чистый MVVM, но он работает.

public interface ICalculationProvider<TResult>
{
    event EventHandler CanExecuteChanged;

    Func<TResult> CalculationDelegate { get; set; }

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

Я отметил ответ Рэйчел как правильный, просто потому что то, что я делаю здесь, не является чистым MVVM.

...