我正在尝试实现一个解决方案,在通过文本框添加按钮后显示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});
}
}
答案 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;
}
}