Aktualizowanie danych na ListBox'ie - interakcja między oknami.

0

Witam,
nie mam zbyt dużego doświadczenia w .NET'ie, dlatego proszę Was o pomoc.

Okno podstawowe programu MainWindow:
MainWindow XAML:

...
<ListBox Name="listBoxLista"/>
...
<Button Name="buttonPodglad" Click="buttonPodglad_Click">Podgląd...</Button>
...

MainWindow C#:

...
public List<DaneUzytkownika> listaUzytkownikow = new List<DaneUzytkownika>();
...
OknoPodgladuIEdycjiDanych okienkoPodgladu;
...
private void buttonPodglad_Click(object sender, RoutedEventArgs e)
        {
            okienkoPodgladu = new OknoPodgladuIEdycjiDanych(listaUzytkownikow[listBoxLista.SelectedIndex].Imie, listaUzytkownikow[listBoxLista.SelectedIndex].Nazwisko, listaUzytkownikow[listBoxLista.SelectedIndex].Mail);
            okienkoPodgladu.Show();
        }
...

Klasa DaneUzytkownika zawiera trzy pola - Imie, Nazwisko, Mail.

OknoPodgladuIEdycjiDanych XAML:

...
<TextBox Name="textBoxImie" TextChanged="textBoxImie_TextChanged"></TextBox>
<TextBox Name="textBoxNazwisko" TextChanged="textBoxNazwisko_TextChanged"></TextBox>
<TextBox Name="textBoxMail" TextChanged="textBoxMail_TextChanged"></TextBox>
<Button Name="buttonZamknij" Content="Zamknij" Click="buttonZamknij_Click"></Button>
...

OknoPodgladuIEdycjiDanych C#:

...
partial class OknoPodgladuIEdycjiDanych : Window
    {
        public OknoPodgladuIEdycjiDanych(string imie, string nazwisko, string mail)
        {
            InitializeComponent();
            textBoxImie.Focus();
            Imie = imie;
            Nazwisko = nazwisko;
            Mail = mail;
            textBoxImie.Text = Imie;
            textBoxNazwisko.Text = Nazwisko;
            textBoxMail.Text = Mail;
        }

        public string Imie { set; get; }
        public string Nazwisko { set; get; }
        public string Mail { set; get; }

        private void textBoxImie_TextChanged(object sender, TextChangedEventArgs e)
        {
            Imie = textBoxImie.Text;
            (App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Imie = Imie;
            zapiszOdswiez();
        }

        private void textBoxNazwisko_TextChanged(object sender, TextChangedEventArgs e)
        {
            Nazwisko = textBoxNazwisko.Text;
            (App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Nazwisko = Nazwisko;
            zapiszOdswiez();
        }

        private void textBoxMail_TextChanged(object sender, TextChangedEventArgs e)
        {
            Mail = textBoxMail.Text;
            (App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Mail = Mail;
            zapiszOdswiez();
        }

        private void buttonZamknij_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }

        private void zapiszOdswiez()
        {
            (App.Current.MainWindow as MainWindow).listBoxLista.ItemsSource = null;
            (App.Current.MainWindow as MainWindow).listBoxLista.ItemsSource = (App.Current.MainWindow as MainWindow).listaUzytkownikow;
        }
    }
...

Po wybraniu danego pola na listBoxLista, a następnie po wciśnięciu przycisku "Podgląd" wyświetla się oddzielne okienko (OknoPodgladuIEdycjiDanych), w którym mam podgląd danej pozycji z listBoxLista, czyli w textBoxImie mamy listaUzytkownikow[listBoxLista.SelectedIndex].Imie, w textBoxNazwisko mamy listaUzytkownikow[listBoxLista.SelectedIndex].Nazwisko, w textBoxMail mamy listaUzytkownikow[listBoxLista.SelectedIndex].Mail.
Przy nadal włączonym oknie OknoPodgladuIEdycjiDanych, po wskazaniu z głównym oknie (MainWindow) innego pola z listBoxLista, zmieniają się dane w oknie OknoPodgladuIEdycjiDanych w polach textBoxImie, textBoxNazwisko, textBoxMail... sprawa jasna, wszystko działa.
Problem polega na tym, że potrzebuję mieć jeszcze funkcjonalność, polegającą na tym, że kiedy zmieniam coś w polach textBox'owych w OknoPodgladuIEdycjiDanych (np. w textBoxImie zmieniam imię na jakieś inne), to w oknie głównym (MainWindow) na listBoxLista, w wybranym aktualnie polu, dane powinny się od razu zmieniać. Od razu - w momencie pisania, czyli kiedy zaczynam pisać "Adam", to dane w na listBoxie mają się 'odświeżać' i pojawiać identycznie do tego, co pojawia się w polu textBoxImie w oknie poglądu. Po to właśnie użyłem TextChanged w XAMLu, ale wywala mi wyjątki w metodach private void textBoxImie_TextChanged(object sender, TextChangedEventArgs e), private void textBoxNazwisko_TextChanged(object sender, TextChangedEventArgs e), private void textBoxMail_TextChanged(object sender, TextChangedEventArgs e) - za pewne jakoś kiepsko odwołuję się do okna głównego ((App.Current.MainWindow as MainWindow)).

Proszę o pomoc.

0

Dobra, coś odkryłem - że z grubsza nie idę złą drogą.
W metodach:
textBoxImie_TextChanged
textBoxNazwisko_TextChanged
textBoxMail_TextChanged

zmieniłem kolejno linijki kodu:

...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Imie = Imie;
...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Nazwisko = Nazwisko;
...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[(App.Current.MainWindow as MainWindow).listBoxLista.SelectedIndex].Mail = Mail;
...

na:

...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[0].Imie = Imie;
...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[0].Nazwisko = Nazwisko;
...
(App.Current.MainWindow as MainWindow).listaUzytkownikow[0].Mail = Mail;
...

I teraz działa mi zmiana na bieżąco danych na listBoxLista (z MainWindow), względem tego, co zmieniam w textBox'owych polach w OknoPodgladuIEdycjiDanych. Oczywiście zmieniają się dane tylko w pierwszym od góry polu (listaUzytkownikow[0]), co zrobić, żeby zmieniały się dla wybranego w danym momencie pola na listBoxLista?

Proszę o pomoc, bo nie mam pomysłów.

0

Dobra, sam sobie poradziłem.

Do zamknięcia.

1

(App.Current.MainWindow as MainWindow).listBoxLista.ItemsSource = null;
(App.Current.MainWindow as MainWindow).listBoxLista.ItemsSource = (App.Current.MainWindow as MainWindow).listaUzytkownikow;

brzydki ten kod.

var window = App.Current.MainWindow as MainWindow;
window.listBoxLista.ItemsSource = window.listaUzytkownikow;

itd.

1 użytkowników online, w tym zalogowanych: 0, gości: 1