模型内部嵌套 类 属性的 ViewModel 属性
ViewModel properties for properties of nested classes inside the model
我有一个遵循 MVVM 模式的应用程序,它必须序列化 XML 个文件。由于某些 XML 属性是嵌套的,因此我在我的模型中创建了嵌套的 classes,如下所示:
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
嵌套的classes的属性都是字符串,因为这暂时简化了XML序列化(我还在构思阶段)。
在我相应的 ViewModel 中,我只是为模型内部的嵌套 class 创建了一个 属性,因此我可以通过引用这个嵌套 [=] 来访问所有嵌套属性53=] 来自 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(); }
}
但是,问题是我想使用 UI.
上的复选框将某些属性显示为布尔值而不是字符串
说我想将 Model.oper.vin.vin_1
显示为布尔值(其中 ViewModel 应该在它自己的 getter 中管理从 string
到 bool
的转换 属性 Model.oper.vin.vin_1
) 的反映,我该怎么做?
我 真的 必须将嵌套 class 中的每个嵌套 属性 作为 ViewModel 自己的 属性 实现吗(如所述下面)来控制它返回到 UI?
的方式
//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"; }
}
}
我希望有更好的解决方案...
编辑:
我之前忘了说的是,不仅 string
s 必须显示为 boolean
s,还有 DateTime
-values 应该显示为DatePicker
-control,整数值,我希望有 NumberPicker
s 等等。
另一方面,xml-文件将被一个接口使用,该接口具有一些我需要匹配的非常固定的规则,例如 integer
- 和 integer
- 上的动态前导零float
-值、特殊日期格式和逗号而不是点作为小数点分隔符。因此,坚持使用要序列化的对象内部的 string
值是保持控制值在 xml 文件中实际解析的方式的好方法。
正如@BrandlyDOTNet 推荐的那样,我将尝试使用一些不同的转换器进行试验,但仍然对如何以另一种方式解决这个问题感到好奇。
有一个不同的解决方案,即您可以使用转换器来定义字符串和布尔值之间的转换。
类似于:
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”转换为布尔值。此外,您可以强类型化正在序列化的对象,因此 none 这实际上是必要的.
我有一个遵循 MVVM 模式的应用程序,它必须序列化 XML 个文件。由于某些 XML 属性是嵌套的,因此我在我的模型中创建了嵌套的 classes,如下所示:
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
嵌套的classes的属性都是字符串,因为这暂时简化了XML序列化(我还在构思阶段)。
在我相应的 ViewModel 中,我只是为模型内部的嵌套 class 创建了一个 属性,因此我可以通过引用这个嵌套 [=] 来访问所有嵌套属性53=] 来自 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(); }
}
但是,问题是我想使用 UI.
上的复选框将某些属性显示为布尔值而不是字符串说我想将 Model.oper.vin.vin_1
显示为布尔值(其中 ViewModel 应该在它自己的 getter 中管理从 string
到 bool
的转换 属性 Model.oper.vin.vin_1
) 的反映,我该怎么做?
我 真的 必须将嵌套 class 中的每个嵌套 属性 作为 ViewModel 自己的 属性 实现吗(如所述下面)来控制它返回到 UI?
的方式//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"; }
}
}
我希望有更好的解决方案...
编辑:
我之前忘了说的是,不仅 string
s 必须显示为 boolean
s,还有 DateTime
-values 应该显示为DatePicker
-control,整数值,我希望有 NumberPicker
s 等等。
另一方面,xml-文件将被一个接口使用,该接口具有一些我需要匹配的非常固定的规则,例如 integer
- 和 integer
- 上的动态前导零float
-值、特殊日期格式和逗号而不是点作为小数点分隔符。因此,坚持使用要序列化的对象内部的 string
值是保持控制值在 xml 文件中实际解析的方式的好方法。
正如@BrandlyDOTNet 推荐的那样,我将尝试使用一些不同的转换器进行试验,但仍然对如何以另一种方式解决这个问题感到好奇。
有一个不同的解决方案,即您可以使用转换器来定义字符串和布尔值之间的转换。
类似于:
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”转换为布尔值。此外,您可以强类型化正在序列化的对象,因此 none 这实际上是必要的.