В нашей модели предметной области имеется множество объектов неизменных значений, одним из примеров этого является позиция, определяемая широтой, долготой и высотой.
/// <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, который имеет методы установки getter и , а также метод ToPosition () для извлечения проверенного экземпляра неизменной позиции. Хотя это решение будет в порядке, оно приведет к большому количеству дублированного кода, особенно XAML.
Объекты значений, о которых идет речь, состоят из трех-пяти свойств, которые обычно представляют собой вариант X, Y, Z и некоторый вспомогательный материал. Учитывая это, я подумал о создании трех ViewModel для обработки различных возможностей, где каждая ViewModel должна будет предоставлять свойства для значения каждого свойства, а также описание, отображаемое для каждой метки (например, «Локатор»).
Если пойти дальше, кажется, я мог бы упростить его до одной общей модели ViewModel, которая может иметь дело с N свойствами и соединять все, используя отражение. Что-то вроде сетки свойств, но для неизменяемых объектов. Одна проблема с сеткой свойств заключается в том, что я хочу иметь возможность изменить внешний вид, чтобы у меня были метки и текстовые поля, такие как:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
Или поместите его в DataGrid, например:
Latitude | Longitude | Height
32 115 12
Итак, мой вопрос:
Можете ли вы придумать элегантный способ решения этой проблемы? Есть какие-нибудь библиотеки, которые делают это или статьи о чем-то подобном?
В основном я ищу:
- Дублирование кода должно быть минимизировано
- Легко добавлять новые типы объектов значения
- Возможно продлить с некоторой проверкой