WPF czasami sprawy ułatwia, a czasami utrudnia. Bez wątpienia jest jednak ładny 🙂
Dzisiaj chciałbym pokazać jak zrobić prosty dialog, który wywołujemy w programie aby umożliwić użytkownikowi wpisanie jakiegoś tekstu. Setki razy realizowałem takie zadanie w MFC czy WindowsForms – dziś czas na WPF.
Samo wywołanie dialogu nie różni się znacząco od innych technologii. Tworzymy instancję klasy dialogu i wywołujemy „ShowDialog”:
ManualAddFunction dlg = new ManualAddFunction(); dlg.ShowDialog();
Pobranie informacji w jaki sposób użytkownik zakończył dialog (OK, CANCEL) jest już bardziej złożone. Bowiem jako wynik uzyskujemy nie tyle „czystego” bool-a, co ?bool – w praktyce oznacza to że dialog może mieć stan nie określony (ni true ni false) – co wymaga od nas sprawdzenia czy w ogóle występuje jakaś odpowiedź i jeżeli tak, to dopiero możemy sprawdzić jej stan:
if (dlg.DialogResult.HasValue && dlg.DialogResult.Value)
Od strony klasy okienka reakcja na wciśnięcie klawisza „OK” może wyglądać następująco:
DialogResult = true; Close();
No dobra. Ale jak skojarzyć kontrolkę z danymi i w końcu jak ją pobrać ? WPF i mechanizm DataBinding (łączenie kontrolki z danymi) jest tu jak najbardziej pomocny, ponieważ umożliwia ograniczenie ilości obsługiwanych zdarzeń i pozwala „flakom” .NET na zrobienie roboty za nas. W kodzie programu musimy stworzyć „property” które powiążemy z XAML i przez które pobierzemy dane z zewnątrz dialogu. Najprościej tak:
public string Label { get; set; }
Musimy jeszcze powiązać XAML z klasą (wskazać źródło danych). Możemy w konstruktorze zrobić to jedną linijką (główny grid okienka jest w XAML nazwany grud1):
grid1.DataContext = this;
i powiązać nasz textbox z własnością klasy po stronie XAML np. w następujący sposób:
TextBox Text="{Binding Path=FunctionGroup}"