2012-01-11 5 views
0

У меня есть окно с текстовым полем и кнопка отправки. При нажатии кнопки «Отправить» данные в текстовом поле должны заполняться в списке и сохраняться.Заполнение ListBox

Каков наилучший способ сделать это? Я попробовал рекомендацию (используя ObservableCollection) из более раннего вопроса, который у меня был, но я не могу заставить его работать. Я попытался его реализации, как это:

Я создал класс:

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

Assigned связывание в моем 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»

Что для меня очевидно, в том, что, когда я создал класс I Ждут» t указать что-либо о имени учетной записи из текстового поля, поэтому я даже не знаю, правильный ли класс.

Я в основном смущен и не знаю, что делать. Любая помощь будет оценена по достоинству ...

ответ

2

МОДЕЛЬ

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

редактировать: добавлено DisplayMemberPath на ListBox XAML

1

Ваши ItemsSource для вашего ListBox - это имя_пользователя, которое представляет собой только строку, но не коллекцию.

Вам нужно создать ViewModel (ваш DataContext для зрения), как это:

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

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

Bind ItemsSource на имущество Accounts:

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

И затем, в вашем клик обработчик события вы можете просто добавить текущее значение текстового поля в свою коллекцию:

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

Но не забудьте установить DataContext вашего окна в класс ViewModel.

+0

Я сделал все это, но он все еще не работает. Я должен пропустить что-то простое. Единственное отличие здесь в том, что мне пришлось создать экземпляр ViewModel экземпляра okBtn_Click. ViewModel vm = new ViewModel(); vm.Accounts.Add (accountaddTextBox.Text); – Woody

+0

Вы установили свой DataContext своего окна? 'mainWindow.DataContext = new ViewModel();' Вам нужно только один раз создать экземпляр viewmodel, а не на каждом клике! –

+0

Да. 'public Account() { InitializeComponent(); DataContext = new ViewModel(); } ' – Woody

2

Вот Демонстрационный используя MVVM подход

ViewModel

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 Binding

<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 и формирования porpeties остается ДО вы

Смежные вопросы