Преобразование значений (кг в фунты) в схеме MVVM - PullRequest
2 голосов
/ 07 июня 2011

Я создаю приложение, которое может отслеживать вес. Я разрешаю пользователю выбирать свои предпочтения в единицах кг или фунты. Я хочу сохранить данные в стандарте БД (кг), поэтому, если пользователь выбирает фунты в качестве предпочтения, мне необходимо преобразовать данные из кг в фунты в пользовательском интерфейсе.

Ответы [ 4 ]

7 голосов
/ 07 июня 2011

Это преобразование может быть легко обработано в ViewModel.

Это одно из огромных преимуществ наличия ViewModel - вы можете иметь легко тестируемую логику, такую ​​как преобразование между единицами, которая полностью отделена от кода пользовательского интерфейса.

1 голос
/ 07 июня 2011

Я предлагаю вам использовать это свойство Coverter DataBinding и разрешить его с помощью XAML.

DataBinding = { Binding Path = YourProperty,Converter = {StaticResource YourConverter}}

YourConverter должен реализовать интерфейс IValueConverter ( msdn doc ) и должен быть объявлен какРесурс.

Я бы предпочел этот подход, потому что держите логику преобразования на стороне просмотра.

0 голосов
/ 07 июня 2011

Лучший способ объяснить это - использовать пользовательский интерфейс конвертера. Вместо того чтобы говорить дальше, я приведу вам пример.

    private IConverter<Double, Double> weightConverter = new KgToLbsConverter();
    private double _weight;
    public double Weight
    {
        get
        {
            return weightConverter.ConvertFrom(_weight);
        }

        set
        {
            _weight = weightConverter.ConvertTo(value);
            RaisePropertyChanged(() => Weight);
        }
    }

    /// <summary>
    /// Provides a simple converter contract.
    /// </summary>
    /// <typeparam name="T">The source Type</typeparam>
    /// <typeparam name="R">The target Type.</typeparam>
    public interface IConverter<T, R>
    {
        R ConvertFrom(T value);
        T ConvertTo(R value);
    }

    /// <summary>
    /// Provides a converter to change Kg to Lbs and vice versa
    /// </summary>
    public class KgToLbsConverter : IConverter<Double, Double>
    {
        /// <summary>
        /// From Kg to Lbs.
        /// </summary>
        /// <param name="value">The weight in Kg.</param>
        /// <returns>The weight in Lbs.</returns>
        public double ConvertFrom(double value)
        {
            return value / 2.2;
        }

        /// <summary>
        /// From Lbs to Kg.
        /// </summary>
        /// <param name="value">The weight in Lbs.</param>
        /// <returns>The weight in Kg.</returns>
        public double ConvertTo(double value)
        {
            return value * 2.2;
        }
    }

Используя это, вы можете сделать любые конвертеры, какие захотите, и затем позволить пользователю выбирать из конкретных реализаций.

Примечание. Причина, по которой я предпочитаю это преобразователям, заключается в том, что моделям представлений может понадобиться знать, какой режим преобразования активен и как с ними работать, это добавляет немало гибкости. Когда вам нужно одно преобразование для взаимосвязи V-VM, тогда IValueConverter - это то, что вам нужно, но для вашего сценария это легче поддерживать и расширять.

0 голосов
/ 07 июня 2011

Полагаю, мы в WPF. Используйте Binding Converter и создайте объект, реализующий IValueConverter, выполнив надлежащим образом сконфигурированное преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...