ListBox显示“Namespace.Accounts”而不是实际文本

时间:2012-01-13 15:18:29

标签: c# wpf

  

可能重复:
  WPF ListBox - Display properties of the ItemSource

我正在尝试实现一个解决方案,在通过文本框添加按钮后显示ListBox中的项目并添加按钮...作为WPF的新手,我几乎已经弄明白了(经过一周的敲击之后)我的头靠在我的桌子上......哈哈)

问题是列表框是用“WinBudget.Accounts”填充的,而不是在列表框中输入的实际项目。

请帮忙。

模型

// the model is the basic design of an object containing properties
// and methods of that object. This is an account object.

public class Account : INotifyPropertyChanged
{
    private string m_AccountName;

    public event PropertyChangedEventHandler PropertyChanged;

    public string AccountName
    {
       get { return m_AccountName;}
       set 
         { 
            m_AccountName = value;
            OnPropertyChanged("AccountName");
         }
    }

    protected void OnPropertyChanged(string name)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
          handler(this, new PropertyChangedEventArgs(name));
      }
    }
}

ListBox XAML

 <ListBox Name="MyAccounts" />

代码背后

// create a collection of accounts, then whenever the button is clicked,
//create a new account object and add to the collection.

public partial class Window1 : Window
{
    private ObservableCollection<Account> AccountList = new ObservableCollection<Account>();

    public Window1()
    {
        InitializeComponent();
        AccountList.Add(new Account{ AccountName = "My Account" });
        this.MyAccounts.ItemsSource = AccountList;
    }
     private void okBtn_Click(object sender, RoutedEventArgs e)
    {
       AccountList.Add(new Account{ AccountName = accountaddTextBox.Text});
    }
}

3 个答案:

答案 0 :(得分:3)

WPF的UI可以包含任何类型的对象,甚至包括Account等类。如果WPF在UI中遇到它不理解的对象,它将使用包含该对象的TextBlock的{​​{1}}来呈现它。

在您的情况下,.ToString()是一个ListBox.Item对象,因此它将使用Account进行渲染,并返回类名。

有许多不同的处理方法。我首选的方法通常是使用Account.ToString()。这将创建一个应用程序范围的模板,告诉WPF如何绘制特定类型的对象。

DataTemplate

另一种方法是覆盖<Window.Resources> <DataTemplate TargetType="{x:Type local:Account}"> <TextBlock Text="{Binding AccountName}" /> </DataTemplate> </Window.Resources> 以指定ListBox.ItemTemplate用于ItemTemplate的{​​{1}}。如果我想指定仅用于ListBox

的模板,我通常会使用此功能
ListBox

如果您的模板很简单,例如显示的模板,您还可以设置ListBox的<ListBox Name="MyAccounts"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding AccountName}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> ,使默认模板看起来像上面显示的那样,绑定指向您放入{{1 }}

DisplayMemberPath

当然,您也可以覆盖DisplayMemberPath对象的<ListBox Name="MyAccounts" DisplayMemberPath="AccountName" /> 方法以返回Account而不是默认的ClassName,但在这种情况下我不会推荐它。

答案 1 :(得分:0)

默认情况下,ListBox的项目模板显示为对象调用ToString()的结果。因此,您必须覆盖Account.ToString(),或提供其他模板。

答案 2 :(得分:0)

最好绑定到Account::AccountName属性,但是如果你因为任何原因不知道或不能,那么快速而肮脏的解决方案可能

公共类帐户:INotifyPropertyChanged {     私有字符串m_AccountName;

public event PropertyChangedEventHandler PropertyChanged;

public string AccountName
{
   get { return m_AccountName;}
   set 
     { 
        m_AccountName = value;
        OnPropertyChanged("AccountName");
     }
}

protected void OnPropertyChanged(string name)
{
  PropertyChangedEventHandler handler = PropertyChanged;
  if (handler != null)
  {
      handler(this, new PropertyChangedEventArgs(name));
  }
}




   //NEW
   public override string ToString()
   {
       return AccountName;
   }

}