6

我有一个正在使用的课程:

public sealed class WorkItemType

ToString很弱(只是显示Microsoft.TeamFoundation.WorkItemTracking.Client.WorkItemType)。

有没有办法覆盖它以显示名称WorkItemType

通常我只会将值聚合到一个新类中,但我将它用于 WPF 中的绑定(我希望在组合框中有一个 WorkItemTypes 列表并将所选值分配给绑定WorkItemType变量。)

我想我在这里运气不好,但我想我会问。

4

7 回答 7

5

一种相当巧妙的方法可能是向WorkItemType对象添加扩展方法。像这样的东西:

public static class ToStringExtension
    {
        public static string MyToString(this WorkItemType w)
        {
           return "Some Stuff"
        }
    }

然后你可以调用类似的东西

WorkItemType w = new WorkItemType;
Debug.WriteLine(w.MyToString();)
于 2010-01-22T22:58:39.497 回答
4

需要覆盖ToString吗?如果您可以控制显示对象的代码,那么您始终可以提供一种FormatWorkItemType方法或达到该效果的东西。

于 2010-01-22T22:45:24.380 回答
2

WPF 提供了几种不同的内置方法来在 UI 中正确执行此操作。两个我推荐:

  • 您可以使用 ComboBox 的 DisplayMemberPath 来显示单个属性值,但仍可以从 WorkItemType 对象中进行选择。
  • 如果您想显示几个属性的组合,您可以更改 ComboBox 的 ItemTemplate 以使其看起来非常像您想要的 - 格式化文本、添加边框、颜色等。您甚至可以将 DataTemplate 设置为自动应用于任何WorkItemType 对象绑定在 UI 中的任何位置(从 UI 角度看与更改 ToString 的基本效果相同),方法是将其放入 Resources 中并仅为其提供不带 x:Key 的 DataType。
于 2010-01-23T04:05:10.757 回答
2

你不走运:-(

您可以编写自己的类来包装 WorkItemType 并将 ToString 委托给它(代理):

class MyWorkItemType
{
  private WorItemType _outer;

  public MyWorkItemType(WorkItemType outer)
  {
    _outer=outer;
  }

  public void DoAction()
  {
    _outer.DoAction();
  }

  // etc

  public override string ToString()
  {
    return "my value"
  }
}
于 2010-01-22T22:45:02.427 回答
1

我没有任何 C# 知识,但是您不能将扩展类包装在另一个类中吗?代理对扩展类的所有方法调用,除了toString(),也很hackish,但我想我还是会提出来。

于 2010-01-22T22:44:57.873 回答
0

用反射做一些魔法可能是你唯一的希望。我知道你可以用它实例化私有构造函数,所以也许你可以覆盖一个密封的类......注意,如果没有其他方法,这应该是你最后的手段。使用反射是一种非常hackish/不正确的方法。

于 2010-01-22T22:38:24.797 回答
0

除了其他特定于 WPF 的答案IValueConverter之外,您还可以在绑定中使用 an来格式化/显示WorkItemType您想要的任何内容。这具有可重用的优点(例如,如果您想在其他控件中显示对象。)

这里有很多使用转换器的例子。这个其他问题应该与此处提到的 ComboBox 用法非常相似。答案指出,您可以使转换器在整个对象集合上工作,也可以一次在一个项目上工作。后者可能是更可重用的方法。

于 2021-09-23T12:18:28.393 回答