Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Bindowanie resources z XAML

Jak się w WPF rozwiązuje kwestię przekazywania do kontrolek danych zależnych od danej kultury? dwa przypadki mi chodzą po głowie. Jeden - mam kontrolkę i chce zmienić jej etykietę na odpowiednią w danym języku, a drugi przykład - mam listę i trzeba jej przekazać odpowiednio przetłumaczone pozycje. Czy kontrolka powinna być jakoś powiązana z resourcem i dostawać od VM tylko klucze do odszukania wartości, czy to VM raczej powinien zwracać już przetłumaczone stringi? Jak to zrobić najprościej?

Temat: Bindowanie resources z XAML

Ha, dobre pytanie!
Niestety nie mam doswiadczenia w tym temacie.
Moze tu:
http://msdn.microsoft.com/en-us/library/ms788718.aspx ?
Łukasz Szumyło

Łukasz Szumyło Xamarin Developer

Temat: Bindowanie resources z XAML

Najprościej byłoby robić to w VM.
Możesz również stworzyć sobie odpowiednie MarkupExtenssion, którego zadaniem będzie tylko i wyłącznie dostarczanie Twoim kontrolkom etykiety w odpowiednim języku, czyli trzymasz w środku słownik etykiet <kodKraju, List<kodEtykiety, tlumaczenie>>.

Na CodeProject znajdziesz tego typu rozwiązanie - niestety nie mam przy sobie teraz linka.
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Też polecam MarkupExtension.

Używam ich na przykład do pobierania wartości do list:
http://stackoverflow.com/a/4398752

Przykład można rozbudować o pobieranie wartości z odpowiedniego pliku resources.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Bindowanie resources z XAML

Ja się zastanawiam, czy to faktycznie ma sens. Zabrakło mi wyobraźni. Co mi daje takie podejście?

Patrząc po podanych przykładach dochodzę do wniosku, że potrzebowałbym kolejnego pliku do projektu.

Mogę osiągnąć mniejszą komplikacje w ten sposób zmieniając kod:


//samplowy fragment VM
ResourceManager _rm = new ResourceManager("langres", Assembly.GetExecutingAssembly());

public ObservableCollection<ComboBoxItem> ComboBoxPartItems { get; private set; }
public void LoadRangeComboBoxPartData()
{
this.ComboBoxPartItems.Add(new ComboBoxItem() { Text = _rm.GetString("key_0"); });
// ...
}
Borysław Bobulski edytował(a) ten post dnia 10.10.12 o godzinie 13:01
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

W twoim podejściu masz pomieszaną logikę z kontrolkami.
Owszem, niby masz mniejszą komplikację kodu, ale nie da się tego automatycznie testować.
Poza tym trudniej będzie modyfikować wygląd w przyszłości.
Na przykład jeśli zmienisz kontrolkę na inną to będziesz musiał przerabiać sporo kodu. W podejściu MVVM wystarczy podpięcie nowej kontrolki do danych.

Poczytaj sobie o MVVM.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Bindowanie resources z XAML

Tak właśnie robię - czytam i od tygodnia się uczę jak pisać poprawnie MVVM.

Odnośnie Twojego postu mam pytania następujące:
1) Dlaczego twierdzisz, że jak w kodzie zmienię kontrolkę na inną to będzę musiał przerabiać sporo kodu? To jest fragment ViewModel i przecież cokolwiek zbinduję z tym ViewModel, to wyświetli się na tym czymkolwiek
2) Czego nie da się testować wprowadzając tutaj ResourceManager - w końcu to tylko zlokalizowane napisy są ?
Łukasz Szumyło

Łukasz Szumyło Xamarin Developer

Temat: Bindowanie resources z XAML

Borysław Bobulski:
Tak właśnie robię - czytam i od tygodnia się uczę jak pisać poprawnie MVVM.

Odnośnie Twojego postu mam pytania następujące:
1) Dlaczego twierdzisz, że jak w kodzie zmienię kontrolkę na inną to będzę musiał przerabiać sporo kodu? To jest fragment ViewModel i przecież cokolwiek zbinduję z tym ViewModel, to wyświetli się na tym czymkolwiek
2) Czego nie da się testować wprowadzając tutaj ResourceManager - w końcu to tylko zlokalizowane napisy są ?

1) Tutaj Marcinowi raczej chodziło o to by w ViewModel'u nie mieszać części UI z częścią obsługującą UI czyli patrząc purrystycznie na MVVM, ComboBoxItem nie powiniene się znaleźć w ViewModel'u bo to jest element UI więc jeśli w przyszłości Twoim UI będzie np. WPF, WP7 czy też Windows 8 Apps, to będziesz musiał również poprawiać pod tym kątem wszystkie swoje ViewModel'e.

2) Tutaj zależy na jakiej zasadzie działa Twój ResourceManager ? Jeśli jest to słownik na podstawie zawartości tabeli w bazie danych to będziesz musiał Unit Test'em potraktować to tak jak każdą inną metodę web serwisową.
Borysław B.

Borysław B. Mgr inżynier
informatyki,
właściciel Matrix
Reliability

Temat: Bindowanie resources z XAML

Właściwie to piszę aktualnie aplikację Win Phone 7.

ad 1)
No dobrze, czyli zbindowanie danych do comboboxa, które nie są otrzymywane z serwera, to zły pomysł. Tak? Biorąc pod uwagę, że pozycje mojego pseudo-comboboxa (bo w WP7 nie ma oryginalneg comboboxa) to pozycje zwykłej listy, ale muszą mieć napisy z resourców - jak to powinno się zaimplementować w XAML?

ad 2)
Ponieważ to aplikacja WP7, menadżer zasobów korzysta z zasobów (resx) tak właśnie jak przedstawiłem. Pasuje to w ogóle testować?
Łukasz Szumyło

Łukasz Szumyło Xamarin Developer

Temat: Bindowanie resources z XAML

Nikt Ci nie broni bindować dane do ComboBox'a z tym, że trzeba to robić inaczej.
Taki standardowy przykład (piszę z biegu więc mogą wkraść się błędy - bardziej chodzi tutaj o koncepcję):

View:

<ComboBox ItemsSource={Binding Countries} DisplayMamberPath=Name />

ViewModel:

public ObservableCollection<Country> Countries {get; set z notyfikacją INotifyPropertyChanged }

Model:

public class Country : INotifyPropertyChanged
{
...
implementacja INotifyPropertyChanged
...

public int Id {get; set z notyfikacją; }
public string Name {get; set z notyfikacją; }
public string Code {get; set z notyfikacją; }

}

W ten sposób ViewModel wie, że jest jakiś model, przygotowuje dane bazując na tym modelu i nie ma zielonego pojęcie kto tak naprawdę będzie te dane konsumował co w powyższym przypadku jest jak najbardziej OK bo dążysz do tego by mieć odseparowaną warstwę prezentacji od warstwy nazwijmy ją logiki prezentacji.

Możesz sobie w ViewModel'u te dane przetłumaczyć na podstawie ResourceManager'a, ale znowu wracając do purrystycznego podejścia do MVVM, to ResourceManager jest tutaj ściśle powiązany z warstwą prezentacji - ViewModel nie musi i nie powinien wiedzieć w jaki sposób dane, które dostarcza są wyświetlane.

Warto byłoby tutaj wprowadzić np. konwerter do Binding'u lub tak jak zasugerowałem wcześniej MarkupExtenssion.

Oczywiście nikt nad Tobą nie stoi z bronią i zrobisz tak by było dla Ciebie najwygodniej - w końcu resx mamy i ASPach, WinFormsach, WPFach i reszcie innych technologii, a jak ResourceManager'a wstrzykniesz sobie do ViewModel'u to w przyszłości zmiana resx na coś innego nie powinna być problemem.

W praktyce do swojego ViewModel'u dorzucisz z czasem jakieś propercje, które będą sterowały Twoim widokiem np. IsCurrencyEnabled etc.
W sieci znajdziesz też mnóstwo podejść, w których znajdą się i takie gdzie elementy UI są wplecione w ViewModel. To jaki kierunek obierzesz, zależy tylko i wyłącznie od Ciebie.
Ja namawiam by podejść do MVVM jak bozia/architektura przykazała czyli starasz się by stworzone warstwy (Presentation Layer, Presentation Logic Layer/Business Layer , Service Layer etc.) miały względem siebie minimum (a najlepiej zero) zależności (luźno powiązane)
Piotr Knut

Piotr Knut Programista i
Informatyk

Temat: Bindowanie resources z XAML

Zgadzam sie z Łukaszem. Bardzo fajnie to wyluszczyles. Mam pytanie jaka lekturę byś zaproponował mi dla tej technologi. Jestem nowy w silverligh i troche mnie pioruny juz strzelają. Coś w naszym języku jak mozna bo Anglika mam troche dosyć. Z góry dzięki za poświęcony czas.
Łukasz Szumyło

Łukasz Szumyło Xamarin Developer

Temat: Bindowanie resources z XAML

Niestety nie spotkałem się z polskimi opracowaniami - no może poza wpisami na blogach polskich deweloperów.

Osobiście polecam:

Prism - dokumentacja (http://compositewpf.codeplex.com/)

blog Jeremy Liknessa (http://csharperimage.jeremylikness.com/)

blog Mike'a Taulty'ego (http://mtaulty.com/)

blog Sachy Barber'a (http://sachabarbs.wordpress.com/)

oraz wszlekiego rodzaje prezentacje, video tutoriale z konferencji Microsoftu (BUILD, TechEd, NDC)

warto także (a może przede wszystkim) pamiętać o John'ie Pappa i jego Silverlight TV (http://channel9.msdn.com/Shows/SilverlightTV)

Z tych źródeł dowiesz się bardzo dużo na temat Silverlight'a, MVVM i wykorzystania niektórych podejść w pokrewnych technologiach (Windows Phone, Windows Store Apps)
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Też mi się wydaje, że nie ma w języku polskim literatury na temat WPF/SL, która całkowicie byłaby poświęcona tej tematyce. Można jakieś fragmenty znaleźć w niektórych książkach na temat .NET, ale potraktowane są bardzo powierzchownie.

Ja również wiedzę czerpię z sieci oraz własnych projektów :)
Piotr Knut

Piotr Knut Programista i
Informatyk

Temat: Bindowanie resources z XAML

Dziękuje za odpowiedz. Długo ignorowalem ta technologie. Pare lat temu jak weszła na rynek wydawało mi sie ze to następny prezenter medi i tak mi to utrwaliło sie. Po przeczytaniu paru linków które mi przeslaliscie jestem pod wrażeniem rozwoju tej technologii. Wspiera wszystkie technologie które potrzebuje do moich projektów. I chodź nieznam dokładnie architektury myśle ze to jest to czego szukałem. Czy znacie jakąś dobra książkę w ang. opisującą architekturę? Czytanie online męczy moje oczka, wole książkę (drukowanie niszczy nasze środowisko naturalne dlatego ta opcja odpada). Kiedyś drukowalem i miałem tony kartek ktore z biegiem czasu pomieszaly sie i poszły do kosza. I tak sobie podejrzewam ze twórcy silverlight zabrali to i stworzyli ta piękna architekturę :-) żart.
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Trochę się spóźniłeś, bo Microsoft wymienia Silverlight na HTML5 i JavaScript :)
Ja do projektów desktopowych używam WPF, ale do webowych nie zdecydowałbym się już na SL.
Głównie ze względu na to, że taka strona nie będzie dostępna przez urządzenia mobilne.
Ale to oczywiście zależy od zastosowań.

Co ciekawe Windows Phone 7.5 bazuje na SL ale z tego co wiem, nie umożliwia oglądania stron w SL :)
Piotr Knut

Piotr Knut Programista i
Informatyk

Temat: Bindowanie resources z XAML

Ja naszczescie nie tworze stron web a teraz po zapoznaniu sie z przyszłością silverlight tym bardziej nie uzylbym tej technologii. Ogólnie podoba mi sie xaml. Łatwość tworzenia UI i oddzielenie logiki od interfejsu użytkownika. Tylko pytanie jest jaka jest przyszłość WPF/WPE oraz SL na WP xxxx? Wiem ze na WP8 SL jeszcze jest :-)
Piotr Knut

Piotr Knut Programista i
Informatyk

Temat: Bindowanie resources z XAML

Tak potwierdzam WP 7 nie umożliwia oglądanie stron napisanych w technologii SL . A nóż widelec sprawdziłem w praktyce :-)
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Obawiam się, że SL podzieli los Flasha. Ale chyba nikt nie jest wstanie przewidzieć przyszłości.

Proponuję dobrać technologię do twoich wymagań.

Jeśli to ma być aplikacja typu desktop to mogę polecić WPF. Chyba ma jeszcze przyszłość :)

Najbardziej lubię go za separację warstw i niemal nieograniczone możliwości definiowania UI.
To duży krok na przód w porównaniu ze starymi Winforms, do których nie chcę już wracać.

Ale okazuje się, że w praktyce nie jest tak różowo. W wielu miejscach Microsoft przekombinował.
Zanim zaczniesz panować nad WPF trzeba się sporo nauczyć i poznać wiele specyficznych funkcjonalności.

Mam za sobą kilka komercyjnych projektów w WPF, a wciąż odkrywam nowe rzeczy :)
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Piotr K.:
Długo ignorowalem ta technologie. Pare lat temu jak weszła na rynek wydawało mi sie ze to następny prezenter medi i tak mi to utrwaliło sie.

I masz rację! Na początku SL 1.0 był bardziej ciekawostką, podzbiorem WPF, który można odpalić w przeglądarce (również na macu!). Później tak obrósł w piórka i dodatki, że kilku rzeczy nie ma WPF :)
Marcin S.

Marcin S. Programista, trener
i konsultant w
zakresie .NET/.NET
Cor...

Temat: Bindowanie resources z XAML

Marcin S.:
Też mi się wydaje, że nie ma w języku polskim literatury na temat WPF/SL, która całkowicie byłaby poświęcona tej tematyce. Można jakieś fragmenty znaleźć w niektórych książkach na temat .NET, ale potraktowane są bardzo powierzchownie.

Ja również wiedzę czerpię z sieci oraz własnych projektów :)

Znalazłem książkę poświęconą wyłącznie WPF "Tworzenie nowoczesnych aplikacji graficznych w WPF" wyd. Helion
http://helion.pl/ksiazki/tworzenie-nowoczesnych-aplika...

Jeszcze nie czytałem, ale spis treści wygląda obiecująco.

Następna dyskusja:

Bindowanie List&lt;dynamic&...




Wyślij zaproszenie do