Отображение данных по-разному в моделях представления, без изменения данных модели - PullRequest
0 голосов
/ 18 ноября 2010

В последнее время меня беспокоит еще одна проблема, и я совершенно уверен, что отсутствие навыков WPF / MVVM мешает мне увидеть очевидное. Я уверен, что решение простое, однако я не уверен, как его реализовать.

Я занимаюсь разработкой в ​​WPF / C # и использую MVPM designpattern.

Для простоты я сводю вопрос к его основным элементам.

Сценарий:

У меня есть модель, содержащая только целое число.

У меня есть родительский ViewModel, отображающий это целое число.

У меня есть две дочерние модели представления, инкорпорированные в родительскую модель представления, обе из которых отображают это целое число. В одной из моделей представления у меня есть команда, увеличивающая значение целого числа на 1. Значение изменяется в модели, которая реализует INotifyPropertyChanged, поэтому второй модуль ViewModel узнает об изменении, поэтому он может обновляться соответствующим образом.

Пока все отлично работает.

Однако мне интересна новая функция, и я не могу заставить ее работать. Скажем, я на своей второй модели представления хочу отобразить целое число, но я хочу изменить способ отображения данных. Это должно быть сделано, однако, без изменения данных в модели. Если данные в модели изменятся, преобразованные данные изменятся соответственно.

В качестве примера, давайте предположим, что целое число равно 5. На второй модели представления я хочу отобразить целое число + 2, что означает 7. Затем данные из первой модели представления изменяются на 6, что означает, что свойство второй модели просмотра автоматически изменяется на 8.

Как это реализовано?

Несколько кодовых фрагментов, чтобы проиллюстрировать, как выглядит система:

Модель:

public DataModel()
{
    data = new Data();

    data.Value = 2;
}

public Data data { get; set; }

И класс данных:

public class Data :  INotifyPropertyChanged
{
    private int m_Value;
    public int Value
    {
        get { return m_Value; }
        set
        {
            if (m_Value != value)
            {
                m_Value = value;
                OnPropertyChanged("Value");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {

        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

Основная модель

public class MainViewModel : ViewModelBase
{
    readonly DataModel _dataModel;

    public MainViewModel()
    {
        _dataModel = new DataModel();

        ViewModel1 = new 1ViewModel(this);
        ViewModel2 = new 2ViewModel(this);
    }


    public 1ViewModel ViewModel1 { get; set; }

    public 2ViewModel ViewModel2 { get; set; }

    public Data Data
    {
        get { return _dataModel.data; }

    }



}

И вот как ChildViewmodels связывают себя с объектом Data

public class 1ViewModel : ViewModelBase
{

    private MainViewModel _mainViewModel;

    public 1ViewModel(MainViewModel mainViewModel)
    {
        _mainViewModel = mainViewModel;

    }

    public Data Number
    {
        get { return _mainViewModel.data; }

    }

}

И на view1 я связал свойство Number следующим образом

<TextBlock  Text="{Binding Path=Number.Value}" />

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

Надеюсь, вы сможете помочь.

Ответы [ 2 ]

1 голос
/ 18 ноября 2010

Модель представления должна содержать данные, готовые для отображения, но не осведомленные о способе их отображения.Если вы хотите изменить способ отображения данных в вашем представлении, для этого вы должны использовать Converter .Это позволит вам использовать одну и ту же ViewModel для нескольких видов и иметь разные виды.

Кроме того, обертывание ViewModel внутри ViewModel не обязательно означает, что вы хотите.ViewModel обычно имеет связанный вид.Если у вас нет представления для ViewModel, обработайте данные как обычные классы и перейдите к вашей единственной ViewModel.

0 голосов
/ 28 июня 2014

Используйте IValueConverter:

public class AddConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value + (int)parameter;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (int)value - (int)parameter;            
    }
}

И в свой XAML добавьте ресурс:

И обновите свою привязку:

Я использовал здесь ConverterParameter, но при желании вы можете жестко указать значение. Возможно, вам также понадобится добавить некоторые проверки в ваш конвертер, поскольку он выдаст исключение, если типы не будут правильными.

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