有没有办法“杀死”模型属性?

时间:2013-12-27 19:12:22

标签: c# wpf datagrid

我的应用程序的前端是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个属性,因此任何访问它们的尝试都会导致错误或不可能。

如果存在这样的事情,我猜它会被称为“Variant Properties”。

TIA

注意:我已经通过在GUI级别操作Visibility.Visible字段解决了这个问题。然而,大师告诉我们这是一个坏主意。最佳实践要求此工具应成为模型的一部分。

2 个答案:

答案 0 :(得分:2)

如果列数是常量(意味着用户无法添加'自定义'列),我建议使用位字段enum,如下所示:

[Flags]
public enum ColumnFlags
{
    None = 0,
    Camber = 0x1,
    Rake = 0x2,
    Angle = 0x4,

    // Other optional columns here, keep them powers of 2!
}

然后在Model课程中,保留一个值,例如:

public ColumnFlags ColumnFlags { get; set; }

然后你可以使用......

if(model.ColumnFlags.HasFlag(ColumnFlags.Camber))
{
  // Do something here...
}

if(model.ColumnFlags.HasFlag(ColumnFlags.Rake))
{
   // Do something here...
}

编辑或者,您可以使用Nullable<T>类型指定“缺失”或“空”值。

答案 1 :(得分:2)

您可以使用可空属性:

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;
}