Заполнить ListBox - PullRequest
       4

Заполнить ListBox

0 голосов
/ 11 января 2012

У меня есть окно с текстовым полем и кнопкой отправки.При нажатии кнопки отправки данные в текстовом поле должны заполниться в списке и быть сохранены.

Каков наилучший способ сделать это?Я попробовал рекомендацию (используя 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: невозможно преобразовать из 'string' в 'System.Windows.DependencyProperty'

Для меня здесь очевидно, что при созданиикласс В текстовом поле я ничего не указывал об имени учетной записи, поэтому даже не знаю, правильный ли класс.

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

Ответы [ 3 ]

2 голосов
/ 11 января 2012

Вот демоверсия с использованием подхода 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 и формирование portities остается на ваше усмотрение

2 голосов
/ 11 января 2012

МОДЕЛЬ

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

edit: добавлен displaymemberpath в списке xaml

1 голос
/ 11 января 2012

Ваш ItemsSource для вашего ListBox - AccountName, который является только строкой, но не коллекцией.

Вам необходимо создать модель представления (ваш datacontext для представления) следующим образом:

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

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

Свойство Bind ItemsSource to 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...