Wybór wartości do okna rodzica WPF

0

Witam.

Mam takie może głupie i proste pytanie, ale nawet nie mam pomysłu jak to znaleźć w google :)

Załóżmy mam aplikację okienkową WPF. Mam okno tworzenia nowego dokumentu, a tam opcję wyboru klienta(załóżmy, że to faktura), po kliknięciu w przycisk wyboru klienta otwiera mi się nowe okno z listą klientów i opcjami do wyszukiwania, aby wskazać klienta z listy. Ewentualnie opcja dodania klienta. I teraz najważniejsze, chodzi o to, aby po wskazaniu lub dodaniu klienta okno automatycznie się zamykało a do okna, z którego utworzyłem to do wyboru klienta podstawiały się dane wybranego. Nie mam zupełnie pomysłu jak to ogarnąć... Nie chodzi mi o gotowe rozwiązanie, ale chociaż jakieś nakierowanie czego mam szukać.

Pozdrawiam.

0

Potraktuj klienta jako obiekt i binduj cały obiekt.

0

Podaje hasło: Messenger

0

Ok, rozumiem, cały obiekt to logiczne. Czyli zabawa w XAMLu. Mam trochę przyzwyczajeń ze Swinga i mój pierwszy pomysł to taki, że w oknie rodzicu napisać publiczną metodę, która w argumencie ma obiekt klienta i z okna wyboru klienta wywołuję tę metodę podając wybranego klienta, a następnie zamykam okno.

0

Messangerem to nie bardzo, bo w momencie propagacji zdarzenia okno, będące dzieckiem jeszcze nie istnieje więc zasubskrybowanie takowego zdarzenia w nim jest niemożliwe. Po prostu Subscribe dla takiego eventu w oknie dziecku się zwyczajnie nie odpali.

Ja np. robię tak, że pcham "w górę" różne rzeczy przez IoC jako nazwane instancje, dzięki czemu wiem co odbieram w oknie dziecku, bo viewmodel takiego okna pobiera instancje obiektu o określonej nazwie.

0

Ok dzięki za odpowiedź. Dopiero zaczynam z WPFem także o IoC muszę doczytać.

Wiem, że to źle ale zrobiłem coś takiego, co działa :)

public partial class ClientsWindow : Window
    {
        MainWindow MainWindow;
        public ClientsWindow(MainWindow mainWindow)
        {
            InitializeComponent();
            MainWindow = mainWindow;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MainWindow.setText(tb2.Text);
            this.Close();
        }
    }

Do okna ClientsWindow przekazuję instancję MainWindow, gdzie mam publiczną metodą do ustawiania tekstu w TextBoxie i w ClientsWindow ją wywołuję. Może mógłbym przekazać sam TextBox, jednak tylko tak testuję. Tylko proszę mi się tu nie śmiać. :P

2

Przekazywanie całej instancji jest niedobrym rozwiązaniem. Przekaż do okna potomnego np. Action i wywołaj zeń odpowiednią metodę, przez lambdę, jeśli będziesz chciał, dajmy na to zaktualizować jakiegoś grida.
Tak jak Ty robisz to tylko niepotrzebnie tworzysz sobie sieć zależności.

Natomiast samo informowanie rodzica o tym, że okno potomne coś zrobiło i trzeba zaktualizować formatki rodzica robi się właśnie najlepiej przez Messenger. Poczytaj o Prism albo MVVM Light.

W ogóle Messenger / Event aggregator to świetne narzędzia, które pozwalają informować niepowiązane referencyjnie klasy o zdarzeniach. Strasznie wygodne rozwiązanie tylko trzeba pamiętać o desubskrybowaniu eventów, bo można niechcący nabawić się wycieków pamięci.

0

Ok dzięki za wszystkie sugestie. Poczytam o Prismie i MVVM Light.

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