我在通用 DataGrid 中显示业务对象,并且我想通过自定义属性设置列标题,例如:

class TestBo
 {
    [Header("NoDisp")]
    public int ID {get; set;}

    [Header("Object's name")]
    public String Name { get; set; }
}

到目前为止,一切都很好,但我还想通过继承将显示与数据分开:

class TestBO
{
   public int ID {get; set;}
   public String Name { get; set; }
}

class TestPresentationBO : TestBO
{
  //Question: how to simply set the Header attribute on the different properties?
}

我看到了通过在 Child 构造函数中使用 SetCustomAttribute 进行反射的解决方案,但这会很麻烦,那么对于这个问题有一个简单而优雅的技巧吗?

请阻止我破坏数据/表示分离;o)

有帮助吗?

解决方案

只是想,你不能用部分类和 元数据类型属性?MVC2 使用此模式进行模型验证。

其他提示

  
    

问题:如何简单地设置标题属性对不同的性质

  

有没有办法设置一个继承的成员的一个属性已建议的方式,由于属性特定于一个类型。 SetCustomAttribute不会帮助你 - 当你构建新类型的在运行时,它只是什么好的。一旦一个属性已被编译,你不能在运行时改变它,因为它的一部分的元数据的。

如果你想保持分离,你将不得不另谋出路。

(你可以做的属性虚拟的,在演示类中重写它们,在覆盖添加属性,但是这看起来躲闪并没有真正独立的东西 - 你结束了在你的TestPresentationBO完整TestBO类反正.. 。)

请在TestBo属性虚拟和TestPresentationBO覆盖它们。这样,你可以添加属性。

您可以像WCF RIA服务。将属性添加到TestBO,像[演示]服用类型作为参数。这种新型将重新定义的属性,但与呈现的属性。 在运行时,你必须得到新的类型的身份,并得到其属性的自定义属性。

或者忘掉属性和具有字典映射与呈现BO类的薄。此演示BO类做同样的事情如上述,即具有自定义属性的属性重新定义

演示BO类从不实例化,它只是反映后得到呈现信息。

您是否使用 MVVM(模型视图视图模型)模式?在我看来,部分来自其他答案,您实际上无法像您想要的那样使用自定义属性来做到这一点。但是,在我看来,你的 TestPresentationBO 实际上就像一个“视图模型” TestBO. 。视图模型基本上是业务或逻辑类的一种包装器或代理——这基本上就是您想要的。(这个视图模型的总结可能不是 100% 准确;我自己刚刚开始使用 MVVM。)

您可以创建一个 TestBOViewModel 包裹 TestBO, ,然后传递集合 TestBOViewModel 到数据网格。当然,您可以使用以下方法修饰暴露包装类的属性 [Header("Object's name")] ETC。这不使用继承,但我不明白为什么在这种情况下需要使用继承。但是,使用视图模型确实可以通过使用包装器(视图模型)将演示文稿(视图)与数据(模型)完全分离。

有关 MVVM 模式的更多信息,我发现这是一本有趣的读物: 具有模型-视图-视图模型设计模式的 WPF 应用程序.

像这样的东西。当然,您也可以在这里添加验证和其他好处。

public class TestBOViewModel // extend from DependencyObject 
{                            // if you want to use dependency properties

    private TestBO _myBO;

    public TestBOViewModel(TestBO bo)
    {
        _myBO = bo;
    }

    [Header("NoDisp")]
    public int ID 
    {
        get { return _myBO.ID; }
        set { _myBO.ID = value; }
    }
}

有关C#6.0,你可以轻松地隐藏继承的成员,并介绍自己的属性。这可能,但是,隐藏在原始属性的属性。另外这款简化的语法,使属性只读,所以你可能需要管get / set方法自己。

public class User
{
    public string Login { get; set; }
}


public class UserDetail : User
{
    [Display(Name = "Login:")]
    public new string Login => base.Login;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top