2012-01-14 14 views
0

Вот моя ситуация. У меня есть решение, закодированное, когда я ввожу строку в текстовое поле, и после нажатия кнопки «Добавить» она заполняет список.Заполнение списка при загрузке окна

Теперь я хочу:

а) Сохраните эту строку в файл XML сразу. б) Когда откроется окно, я хочу, чтобы отобразить данные из этого XML-файла в ListBox

Вот что я получил до сих пор:

Класс

public class Accounts : 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)); 
      } 
     } 
    } 
} 

Код За

public partial class Account : Window 
    { 
     private ObservableCollection<Accounts> AccountList = new ObservableCollection<Accounts>(); 

     public Account() 
     { 
      InitializeComponent();   
      this.accountListBox.ItemsSource = AccountList; 
     } 

     private void addBtn_Click(object sender, RoutedEventArgs e) 
     { 
      AccountList.Add(new Accounts { AccountName = accountaddTextBox.Text }); 
     } 

X ПОД

<ListBox DisplayMemberPath="AccountName" Height="164" HorizontalAlignment="Left" Margin="12" Name="accountListBox" VerticalAlignment="Top" Width="161" /> 

Этот код работает для заполнения ListBox после нажмите кнопку Добавить.

Я попытался добавить экземпляр XMLTextReader в Window_Loaded и использовать ArrayList, чтобы попытаться прочитать файл XML и загрузить его, но когда я использую ItemsSource, он возвращается с ошибкой, которую я должен использовать ItemControl. ItemsSource ...

Вот что я пытался, но он не:

private void Window_Loaded(object sender, RoutedEventArgs e) 
     {   
      XmlTextReader reader = new XmlTextReader("Accounts.xml"); 
      ArrayList ar = new ArrayList(); 

      // Loop over the XML file 
      while (reader.Read()) 
      { 
       // Here we check the type of the node, in this case we are looking for element 
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        // If the element is "accounts" 
        if (reader.Name == "Accounts") 
        { 
         ar.Add(reader.Value); 

         accountListBox.ItemsSource = ar; 
        } 
       } 
      } 

      reader.Close(); 
     } 

ответ

0

это звучит как только, имеющего обязательную силу в ArrayList в ListBox неприятности.

Вы код не идеален, но похоже, что он должен работать.

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

ArrayList ar = new ArrayList(); 
ar.Add("hello"); 
ar.Add("world"); 
this.accountListBox.ItemsSource = ar; 

Если вы до сих пор не имеют каких-либо удачи пожалуйста, напишите точный текст ошибки, поэтому мы знаем, что мы пытаемся исправить ...

+0

я ошибся, я не получаю сообщение об ошибке, это просто ничего не показывает, а затем мой код, чтобы добавить текст больше не работает. Это имеет какое-то отношение к ItemsSource ... – Woody

+0

Это сводится к привязке ArrayList к ListBox - все остальное в вашем вопросе (я думаю) не имеет значения. Вы пробовали использовать вышеприведенный код в новом решении? –

1

Сделайте ViewModel, как AccountListViewModel

public class AccountListViewModel : INotifyPropertyChanged 
{ 
    private ObservableCollection<Accounts> accountList= 
              newObservableCollection<Accounts>(); 
    private string accountName; 
    ICommand AddAccountCommand {get;set;} 

    public event PropertyChangedEventHandler PropertyChanged; 

    public AccountListViewModel() 
    { 
     ReadAllAccountsFromXml(); 
     AddAccountCommand=new RelayCommand(AddAccountToListAndSave); 
    } 

    private void ReadAllAccountsFromXml() 
    {   
     XmlTextReader reader = new XmlTextReader("Accounts.xml"); 


     // Loop over the XML file 
     while (reader.Read()) 
     { 
      // Here we check the type of the node, in this case we are looking for element 
      if (reader.NodeType == XmlNodeType.Element) 
      { 
       // If the element is "accounts" 
       if (reader.Name == "Accounts") 
       { 
        var account = new Accounts() 
        account.AccountName=reader.Value; 
        AccountList.Add(account) 
       } 
      } 
     } 

     reader.Close(); 
    } 

    private void AddAccountToListAndSave(object obj) 
    { 
     var account = new Accounts(); 
     account.AccountName=AccountnName; 
     AccountList.Add(account); 
     SaveListToXml(); 
    } 

    private void SaveListToXml() 
    { 
     //Write Xml Saving Code Here With Object as AccountList 
    } 
    public ObservableCollection<Accounts> AccountList 
    { 
     get { return accountList; } 
     set 
     { 
      accountList = value; 
      OnPropertyChanged("AccountList"); 
     } 
    } 
    public string AccountName 
    { 
     get { return accountnName; } 
     set 
     { 
      accountnName = value; 
      OnPropertyChanged("AccountName"); 
     } 
    } 

    protected void OnPropertyChanged(string name) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) 
     { 
      handler(this, new PropertyChangedEventArgs(name)); 
     } 
    } 
} 

В вашем Xaml.cs

public partial class Account : Window 
{ 
    private ObservableCollection<Accounts> AccountList = new ObservableCollection<Accounts>(); 

    public Account() 
    { 
     InitializeComponent();   
     this.DataContext= new AccountListViewModel(); 
    } 

} 

В вашем Xaml

<ListBox Height="164" HorizontalAlignment="Left" Margin="12" Name="accountListBox" VerticalAlignment="Top" Width="161" ItemSource=AccountList> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <TextBlock Text={Binding Path=AccountName}/> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

<TextBox Text={Binding Path=AccountName,UpdateSourceTrigger=PropertyChanged}></TextBox> 

<Button Command={Binding Path=AddAccountCommand}/> 

Я считаю, что это нужно сделать, это ....

+0

Я думаю, что это сработает.Но я получаю, что 'AddAccountCommand' не существует в текущем контексте, чего я не понимаю, потому что мы определили его в' ICommand' ... – Woody

+0

@Woody Я отредактировал ответ. Вы должны использовать RelayCommand или какую-то команду для вызова функции ViewModel из представления ... Я считаю, что вы ищете 'RelayCommand' на google, и вы найдете его наверняка, или вы можете использовать инструментарий MVVMLight ... thats all вам нужно ... – Ankesh

+0

Практически там братья ... это то, что я получаю: Аргумент 1: не может преобразовать из «группы методов» в «System.Action» AccountListViewModel.cs – Woody

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