2012-01-13 45 views
1

可能重複:
WPF ListBox - Display properties of the ItemSource列表框顯示「Namespace.Accounts」,而不是實際的文本

我想實現一個解決方案添加它們後,將顯示在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)); 
     } 
    } 
} 

列表框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}); 
    } 
} 
+0

@lance,提到那個線程。 DisplayMemberPath =「AccountName」工作......非常感謝! – Woody 2012-01-13 15:24:36

回答

0

默認情況下,ListBox的項目模板顯示是針對對象調用ToString()的結果。所以你必須覆蓋Account.ToString(),或者提供一個不同的模板。

+2

我更喜歡使用ToString()來顯示診斷信息,而不是UI需求。 – lance 2012-01-13 15:24:38

3

WPF的UI可以包含任何類型的對象,甚至類如Account。如果WPF在UI中遇到一個對象並不理解,它將使用包含對象的.ToString()TextBlock來呈現它。

在你的情況下,ListBox.Item是一個Account對象,所以它得到呈現與Account.ToString(),它返回類的名稱。

處理此問題的方法有很多種。我的首選方法通常是使用DataTemplate。這將創建一個應用程序範圍的模板,告訴WPF如何繪製特定類型的對象。

<Window.Resources> 
    <DataTemplate TargetType="{x:Type local:Account}"> 
     <TextBlock Text="{Binding AccountName}" /> 
    </DataTemplate> 
</Window.Resources> 

另一種方法是覆蓋ListBox.ItemTemplate指定要使用什麼ItemTemplateListBox。我通常會用這個,如果我想指定要使用的模板此ListBox

<ListBox Name="MyAccounts"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding AccountName}" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

如果你的模板是簡單的,如所示的,你也可以設定ListBox的DisplayMemberPath這使得默認模板的樣子如上所示,用任何你放在DisplayMemberPath

<ListBox Name="MyAccounts" DisplayMemberPath="AccountName" /> 

當然的約束力指點的人,你也可以覆蓋你Account對象的ToString()方法返回AccountName而不是默認的ClassNa我,但我不會在這種情況下推薦它。

+1

好東西。謝謝瑞秋。 – Woody 2012-01-13 15:31:31

0

這是更好地做一個結合Account::AccountName屬性,但如果你不wnat或不能以任何理由,快速和骯髒的解決辦法是

公共類賬戶: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; 
    } 

} 
相關問題