В нашей модели домена имеется множество объектов неизменяемых значений, одним из примеров которых является позиция, определяемая широтой, долготой и высотой.
/// <remarks>When I grow up I want to be an F# record.</remarks>
public class Position
{
public double Latitude
{
get;
private set;
}
// snip
public Position(double latitude, double longitude, double height)
{
Latitude = latitude;
// snip
}
}
Очевидным способом разрешить редактирование позиции является создание ViewModel, в котором есть геттеры и сеттеры, а также метод ToPosition() для извлечения проверенного неизменяемого экземпляра позиции. Хотя это решение будет в порядке, это приведет к большому дублированному коду, особенно к XAML.
Объекты ценности, о которых идет речь, состоят из трех и пяти свойств, которые обычно являются некоторым вариантом X, Y, Z и некоторых вспомогательных материалов. Учитывая это, я рассмотрел возможность создания трех ViewModels для обработки различных возможностей, где каждая ViewModel должна была бы выставлять свойства для значения каждого свойства, а также описание для отображения для каждой метки (например, "Широта" ).
Идя дальше, похоже, я могу упростить его до одного общего ViewModel, который может иметь дело с свойствами N и подключать все, используя отражение. Что-то вроде сетки свойств, но для неизменяемых объектов. Одна проблема с сеткой свойств заключается в том, что я хочу иметь возможность изменять внешний вид, чтобы иметь ярлыки и текстовые поля, например:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
Или поместите его в DataGrid, например:
Latitude | Longitude | Height
32 115 12
Итак, мой вопрос:
Можете ли вы придумать элегантный способ решить эту проблему? Существуют ли библиотеки, которые делают это, или статьи о чем-то подобном?
Я в основном ищу:
- Уменьшение дублирования кода
- Легко добавлять новые типы объектов значений
- Возможно расширение с некоторой проверкой