簡體   English   中英

填充列表框

[英]Populate ListBox

我有一個帶有文本框和提交按鈕的窗口。 當按下提交按鈕時,文本框中的數據應填充到列表框中並保存。

最好的方法是什么? 我嘗試了一個較早提出的問題的建議(使用ObservableCollection),但似乎無法正常工作。 我試過像這樣實現它:

我創建了一個類:

public class AccountCollection
{
    private string accountName;
    public string AccountName
    {
        get { return accountName; }
        set { accountName = value; }
    }
    public AccountCollection(string accountName)
    {
        AccountName = accountName;
    }
}        

在我的XAML中分配了綁定:

<ListBox ItemsSource="{Binding AccountName, Mode=TwoWay}" IsSynchronizedWithCurrentItem="True" Height="164" HorizontalAlignment="Left" Margin="12" Name="accountListBox" VerticalAlignment="Top" Width="161" SelectionChanged="accountListBox_SelectionChanged" />

...最后,當用戶從另一個包含“提交”按鈕和文本框的窗口中單擊“提交”按鈕時:

private void okBtn_Click(object sender, RoutedEventArgs e)
{
    BindingExpression expression = okBtn.GetBindingExpression(accountaddTextBox.Text);
    expression.UpdateSource();
}

但是可惜,我無處可去。 我在GetBindingExpression部分收到一條錯誤消息:

參數1:無法從“字符串”轉換為“ System.Windows.DependencyProperty”

對我來說,顯而易見的是,當我創建該類時,我沒有從文本框中指定有關帳戶名稱的任何內容,因此我什至不知道該類是否正確。

我基本上很困惑,不知道該怎么辦。 任何幫助,將不勝感激...

這是使用MVVM方法的演示

視圖模型

public class AccountListViewModel : INotifyPropertyChanged
{

    ICommand AddAccountCommand {get; set;}

    public AccountListViewModel()
    {
        AccountList = new ObservableCollection<string>();
        AddAccountCommand= new RelayCommand(AddAccount);
        //Fill account List saved data
        FillAccountList();
    }

    public AddAccount(object obj)
    {
        AccountList.Add(AccountName); 
        //Call you Model function To Save you lIst to DB or XML or Where you Like
        SaveAccountList()   
    }

    public ObservableCollection<string> AccountList 
    { 
            get {return accountList} ; 
            set
            {
                accountList= value
                OnPropertyChanged("AccountList");
            } 
    }

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

}

Xaml綁定

<ListBox ItemsSource="{Binding Path=AccountList}" Height="164" HorizontalAlignment="Left" Margin="12" Name="accountListBox" VerticalAlignment="Top" Width="161" />

<TextBox Text={Binding Path=AccountName}></TextBox>
<Button Command={Binding Path=AddAccountCommand}><Button>

Xaml.cs代碼

    # region Constructor

    /// <summary>
    /// Default Constructor
    /// </summary>
    public MainView()
    {
        InitializeComponent();
        this.DataContext = new AccountListViewModel();
    }

    # endregion

INotifyPropertyChanged的實現和形成漏洞由您自己決定

模型

// 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" DisplayMemberPath="AccountName" />

后面的代碼

// 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});
    }
}

編輯:在列表框xaml上添加了displaymemberpath

ListBox的ItemsSource是AccountName,它只是一個字符串,而不是一個集合。

您需要像這樣創建一個視圖模型(視圖的數據上下文):

public class ViewModel
{
    public ViewModel()
    {
        Accounts = new ObservableCollection<string>();
    }

    public ObservableCollection<string> Accounts { get; set; }
}

將ItemsSource綁定到Accounts屬性:

<ListBox ItemsSource="{Binding Accounts}" Height="164" HorizontalAlignment="Left" Margin="12" Name="accountListBox" VerticalAlignment="Top" Width="161" />

然后,在按鈕的click事件處理程序中,您可以簡單地將文本框的當前值添加到集合中:

private void okBtn_Click(object sender, RoutedEventArgs e)
{
    Accounts.Add(accountaddTextBox.Text);
}

但是不要忘記將窗口的DataContext設置為ViewModel類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM