【问题标题】:Change own class base name to add to listboxitem更改自己的类基名称以添加到 listboxitem
【发布时间】:2015-08-22 07:09:38
【问题描述】:

我有对象Audio,属性为“标题”、“艺术家”等。 我将它添加到ListboxItem 并且内容变为

{audio202738880_386844236}

这里是screenshot

如何更改此基础:{audio202738880_386844236} 以重视我想要的(例如 audio.Artist + " - " audio.Title)?

【问题讨论】:

  • Audio 是你的班级吗?
  • @ArtemKulikov 它的 VkNet 库。我用 Nuget 安装了它

标签: c# winforms


【解决方案1】:

您必须重写 ToString() 方法。此方法用于确定 Listbox 中显示的内容。

public override string ToString()
{
    return "Whatever You can construct";
}

您可以从类中的属性构造返回值,以对对象进行合理的字符串表示。

如果它不是您的直接类,您可以创建自己的继承自 Audio 类的类,将覆盖放在那里并在您的代码中使用该新类。除了ToString() 函数外,它的行为完全相同。这仅在 Audio 未标记为 sealed 时才有效。

public class MyAudio : Audio
{

    public override string ToString()
    {
        return "Whatever You can construct";
    }
}

由 Moe Farag 添加

如果已经存在基类实现的override,您可能需要将ToString() 标记为new。但是,您必须确保在使用 ToString() 方法时使用子类(在本例中为 MyAudio),以便使用新的实现。

public class MyAudio : Audio
{

    public new string ToString()
    {
        return "Whatever You can construct";
    }
}

【讨论】:

  • 这不是我自己的课
【解决方案2】:

您有几种方法可以做到这一点。 如果 Audio 是您的班级 - 您应该重写 ToString 函数:

public override string ToString()
{
   return string.Format("{0}_{1}", Artist, Title);
}

如果没有并且您使用 WinForms - 您应该自己实现函数DrawItem 并重绘ListBox。另外,不要忘记将属性DrawMode 更改为值DrawMode.OwnerDrawFixed。它表明,listbox 控件中的所有元素都是手动绘制的。

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
   // Draw the background of the ListBox control for each item.
   e.DrawBackground();

   // Draw the current item text
   var currentItem = listBox1.Items[e.Index] as Audio;
   var outputStr = string.Format("{0}_{1}", currentItem.Artist, currentItem.Title);
   e.Graphics.DrawString(outputStr, e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault);

   // If the ListBox has focus, draw a focus rectangle around the selected item.
   e.DrawFocusRectangle();
}

实际上,如果您使用 WPF - 您还有第三个变体。但问题是字段TitleArtist 应该有访问器方法。如果你的类没有它 - 它不起作用。 首先你应该设置ItemsSource

listBox1.ItemsSource = YourList<Artist>();

下一步 - 使用 ListBox 的 ItemTemplate 属性:

<ListBox.ItemTemplate>
   <DataTemplate>
      <WrapPanel>
         <TextBlock Text="{Binding Path=Artist}" />
         <TextBlock Text="_" />
         <TextBlock Text="{Binding Path=Title}" />
      </WrapPanel>
   </DataTemplate>
</ListBox.ItemTemplate>

最后一个变体,如果您的字段没有访问器。正如我所说,您拥有的一种方法是继承一个类并实现ToString

public class MyAudio : Audio
{
   public override string ToString()
   {
      return string.Format("{0}_{1}", Artist, Title);
   }
} 

【讨论】:

  • 这不是我自己的课
  • 是的,我为您添加了第二个变体。您应该使用来自ListBoxDrawItem void。
  • 没有。 WPF 需要它吗?
  • 是的。能改吗?
  • 很好,wpf 变体运行良好。但是如何在 之前添加迭代 例如:1. Artist_Title
猜你喜欢
  • 2020-07-14
  • 2021-07-16
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2011-05-20
相关资源
最近更新 更多