2015-06-19 3 views
2

У меня есть приложение, следующее за шаблоном MVVM, который должен сериализовать XML-файлы. Поскольку некоторые из атрибутов XML вложены, я создал вложенные классы в моей модели, как это:Свойства ViewModel для свойств вложенных классов внутри модели

public class OPER_FILE 
{ 
    public UNB unb { get; set; } 
    public OPER oper { get; set; } //nested class, level 1 

    public OPER_FILE() 
    { 
     unb = new UNB(); 
     oper = new OPER(); 
    } 
} 

public class OPER 
{ 
    public UNH unh { get; set; } //these are all nested classes, level 2 
    public UVT uvt { get; set; } 
    public VIN vin { get; set; } 

    public OPER() 
    { 
     unh = new UNH(); 
     uvt = new UVT(); 
    } 
} 

#region "nested classes" 
public class UNB 
{ 
    public string unb { get; set; } 
    public string unb_2 { get; set; } 
} 

public class UNH 
{ 
    public string unh { get; set; } 
    public string unh_2 { get; set; } 
} 

public class UVT 
{ 
    public string uvt { get; set; } 
    public string uvt_1 { get; set; } 
    public string uvt_2 { get; set; } 
} 

public class VIN 
{ 
    public string vin { get; set; } 
    public string vin_1 { get; set; } 
    public string vin_2 { get; set; } 
    public string vin_3 { get; set; } 
    public string vin_4 { get; set; } 
} 
#endregion 

Атрибуты вложенных классов являются строками, так как это упрощает XML-сериализации на данный момент (I» м еще на стадии зачатия).

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

public class OPERViewModel : IViewModelBase 
{ 
    private OPER_FILE Model; 

    public UNB unb 
    { 
     get 
     { return Model.unb;} 
     set 
     { Model.unb = value; } 
    } 

    public OPER oper 
    { 
     get 
     { return Model.oper; } //this is the tricky part, by now I'm just referring to the nested class as a property of the model 
     set 
     { Model.oper = value; } 
    } 

    public OPERViewModel() 
    { Model = new OPER_FILE(); } 
} 

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

Говорить я хочу, чтобы отобразить Model.oper.vin.vin_1, как логическое значение (где ViewModel должен управлять преобразованием string в bool в поглотителе своего собственного отражения имущества Model.oper.vin.vin_1), как бы я это сделать?

Действительно ли действительно должен реализовать каждое вложенное свойство из вложенного класса как собственное свойство ViewModel (как указано ниже), чтобы получить контроль над тем, как он будет возвращен в пользовательский интерфейс?

//ViewModel-implementation with type-conversion of a property from a nested class of the model 
//this would get bind to the UI instead of Model.oper.vin.vin_1 
public bool vin_1  
{ 
    get 
    { 
     if (Model.oper.vin.vin_1 == "1") 
     { return true; } 
     else 
     { return false; } 
    } 
    set 
    { 
     if (value) 
     { Model.oper.vin.vin_1 = "1"; } 
     else 
     { Model.oper.vin.vin_1 = "0"; } 
    } 
} 

Я надеюсь, что есть лучшее решение там ...


Edit:

То, что я забыл упомянуть прежде, вы не только string s, которые имеют для отображения как boolean s, также DateTime -значения, которые должны отображаться как DatePicker -control, integer-values, которые я хотел бы иметь как NumberPicker s и скоро.

XML-файл, с другой стороны, будет потребляться интерфейсом с некоторыми довольно основными правилами, которые я должен соответствовать таким динамически ведущим нулям на обоих integer - и float -значения, специальные форматы дату и запятых вместо точек в виде десятичных разделителей. Так что прилипание к значениям string внутри объекта для сериализации - хороший способ сохранить контроль над тем, как значения будут фактически анализироваться внутри xml-файла.

Я попытаюсь поэкспериментировать с некоторыми другими преобразователями, поскольку @BrandlyDOTNet рекомендовал, но по-прежнему интересно, как это можно решить по-другому.

ответ

2

Там это решение отличается там, а именно, что вы можете использовать конвертер определить преобразование между вашими строками и BOOL.

Что-то вроде:

public class StringToBoolConverter : IValueConverter 
{ 
    public object Convert(...) 
    { 
     return value.ToString() != "0"; 
    } 

    public object ConvertBack(...) 
    { 
     bool boolVal = (bool)value; 
     return boolVal ? "1" : "0"; 
    } 
} 

Использование:

<CheckBox IsChecked={Binding SomeProp, Converter={StaticResource StringToBoolConverter}"/> 

Но чтобы ответить на ваш вопрос более глубокий, нет, структура будет не просто преобразовать строку "1" в логическое значение. Более того, вы можете сильно набирать свой объект, который сериализуется, поэтому ничего из этого не требуется.

+0

По * сильно набрав * вы имеете в виду изменение всех этих '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Я мог бы и сильно ожидал, что по мере продвижения проекта. Но я связан с особыми потребностями интерфейса, который предназначен для использования xml-файла и имеет некоторые строго фиксированные правила формата, которые мне нужно сопоставить. Поскольку быстрое развитие приложений - это порядок дня, я надеялся, что смогу теперь привязать к ним переменные строки и найти что-то, чтобы уменьшить количество кода для записи. Итак, благодаря вам, я посмотрю на этот конвертер. – M463