首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型内嵌套类属性的ViewModel属性

模型内嵌套类属性的ViewModel属性
EN

Stack Overflow用户
提问于 2015-06-19 16:23:58
回答 1查看 1.1K关注 0票数 2

我有一个遵循MVVM模式的应用程序,它必须序列化XML文件。由于有些XML属性是嵌套的,所以我在模型中创建了嵌套类,如下所示:

代码语言:javascript
复制
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序列化(我还在构思阶段)。

在相应的ViewModel中,我只是为模型中的嵌套类创建了一个属性,这样我就可以访问所有的嵌套属性,只需从ViewModel引用这个嵌套类。

代码语言:javascript
复制
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(); }
}

然而,问题是,我希望使用UI上的复选框将某些属性显示为布尔值,而不是字符串。

如果我想将Model.oper.vin.vin_1显示为布尔型( ViewModel应该在它自己的属性反射Model.oper.vin.vin_1的getter中管理从stringbool的转换),我将如何做到这一点?

我是否真的必须将嵌套类中的每个嵌套属性实现为ViewModel的自己的属性(如下面所述),以控制将其返回UI的方式?

代码语言:javascript
复制
//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"; }
    }
}

我希望有更好的解决办法。

编辑:

我之前忘记提到的是,不仅strings必须显示为booleans,DateTime-values也应该显示为DatePicker-control,整数值是NumberPicker,等等。

另一方面,xml-文件将被我需要匹配的一些非常固定的规则所使用,比如integer-和float-values上的动态引导零、特殊的日期格式和逗号,而不是点作为十进制分隔符。因此,坚持在对象中使用string-values来序列化是一个很好的方法,可以保持对如何在xml-文件中实际解析这些值的控制。

随着@BrandlyDOTNet的改进,我将尝试用一些不同的转换器进行实验,但仍然对如何以另一种方式解决这个问题感到好奇。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-19 20:06:42

有一种不同的解决方案,即可以使用转换器来定义字符串和bool之间的转换。

类似于:

代码语言:javascript
复制
public class StringToBoolConverter : IValueConverter
{
   public object Convert(...)
   {
       return value.ToString() != "0";
   }

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

用法:

代码语言:javascript
复制
<CheckBox IsChecked={Binding SomeProp, Converter={StaticResource StringToBoolConverter}"/>

但是为了回答您更深层次的问题,不,框架将不只是将字符串"1“转换为bool。此外,您可以强烈地键入正在序列化的对象,因此这一切实际上都是不必要的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30942893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档