В последнее время меня беспокоит еще одна проблема, и я совершенно уверен, что отсутствие навыков 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}" />
Опять же, я хочу иметь возможность создать второе свойство в модели представления, которое отображает преобразованные данные на основе, но без изменения исходных данных, и которое обновляется вместе с обновляемыми данными.
Предпочтительно, это должен быть своего рода метод-конвертер, который преобразует данные в новые данные.
Надеюсь, вы сможете помочь.