Заполнить список при загрузке окна - PullRequest
0 голосов
/ 14 января 2012

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

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

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

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

Класс

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

XAML

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

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

Я попытался добавить экземпляр 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();
        }

Ответы [ 2 ]

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

Сделать 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 голосов
/ 14 января 2012

Похоже, у вас просто проблемы с привязкой ArrayList к ListBox.

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

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

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

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

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