我的应用程序的前端是DataGrid,其内容被传递到Excel生成方法。

问题在于DataGrid处理13列:其中10列是固定的(即传递给Excel),而最后3列中的每一个都是可选的。

public class GridModel
{
    public string Item          { get; set; }
    public string ItemName      { get; set; }
    public double TotalHeight   { get; set; }
    public double AGLheight     { get; set; }
    public double Embedment     { get; set; }
    public string Shape         { get; set; }
    public double TipDiameter   { get; set; }
    public double BaseDiameter  { get; set; }
    public double Taper         { get; set; }
    public double ShearReaction { get; set; }
    // The following are optional, in 8 combinations, from all present to all absent
    public double Camber        { get; set; }
    public double Rake          { get; set; }
    public double Angle         { get; set; }
}


作为C#新手,我正在考虑不同的方法。

你们将如何处理?想到的最简单的想法是在模型中添加3个标志:

bool IsColumn1Present;
bool IsColumn2Present;
bool IsColumn3Present;


另一种方法是在层次结构中添加一个级别,因此每个“特殊”列均包含其自己的嵌入式标志:

if (Camber.flag) add(Camber.value);


就是说,我希望能够以某种方式删除这3个属性,因此任何访问它们的尝试都将导致错误或不可能。

如果存在这种情况,我想它将被称为“变体属性”。

TIA

注意:我已经通过在GUI级别上操作Visibility.Visible字段解决了此问题。但是,古鲁斯告诉我们,这是一个坏主意。最佳实践表明,此工具应成为模型的一部分。

最佳答案

您可以使用可为空的属性:

public double? Camber { get; set; }


然后在业务逻辑中检查它们的值:

if (thing.Camber.HasValue)
{
    DoSomething(thing.Camber.Value);
}


鉴于您对“变体”属性的评论,听起来这可能正是您所追求的。

更多信息:http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

更新:如果您需要在应用程序范围内关闭它们(根据您的评论),则可以避免在不需要时首先将其设置为值(就我而言,这是更好的选择) ,业务逻辑,并且不属于您的哑模型类)或使用自定义访问器对其进行扩展:

private double? _camber;

public double? Camber
{
    get
    {
        return ModelSettings.CamberEnabled
            ? _camber
            : null;
    }
    set;
}


然后在某处具有一些静态/常量属性:

public static class ModelSettings
{
    public const bool CamberEnabled = true;
}

09-11 05:02
查看更多