steinadler Geschrieben 9. November 2017 Geschrieben 9. November 2017 (bearbeitet) Hallo, ich nutze in meiner Software das MVVM-Pattern. In einem Fenster möchte ich ein Datagrid mit Werten anzeigen (Name, Wert, Einheit). Nun stellt sich mir die Frage, wo ich die Liste erzeuge: im ViewModel oder in der View? Erzeuge ich sie im ViewModel müsste ich die Liste dort entsprechend der eingestellten Sprache befüllen und Darstellung des Zahlenformats jeweils angeben. Erzeuge ich die Liste im Xaml (View), kümmert sich meine LanguageEngine um die Sprache - ich scheitere nur bisher daran, diese Liste so umzusetzen. Hat jemand eine Idee? Bearbeitet 9. November 2017 von steinadler
Mttkrb Geschrieben 9. November 2017 Geschrieben 9. November 2017 (bearbeitet) Hi, wenn die Ausgabe eines Datums mit der aktuell, gesetzten Sprache formatiert werden soll, reicht doch z.B.: <TextBlock Text="{Binding Date, StringFormat='{}{0:d}'}"/> Mit dem Befehl an beliebiger Stelle Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE"); wird die aktuelle Sprache der Anwendung entsprechend gesetzt. Dann wird aus z.B. 11/09/2017 -> 09.11.2017. Die Einheit würde ich als Resource hinterlegen und diese auch per Binding einbinden. Mit dem Ändern der CurrentCulture wird die entsprechende Übersetzung der Resource angezeigt, sofern diese verfügbar ist. (https://msdn.microsoft.com/en-us/library/aa992030(v=vs.100).aspx) Gehst du allerdings nicht den Weg über die CurrentCulture, musst du dich komplett selbst drum kümmern und deine Strings und Formatierungen alle selbst im ViewModel hinterlegen. Ein anderen Wege kenne ich zumindest gerade nicht. EDIT: Die Liste würde ich im ViewModel erzeugen. Die Art der Darstellung wie beschreiben im xaml und in Resourcendateien. Bearbeitet 9. November 2017 von Mttkrb äymm reagierte darauf 1
steinadler Geschrieben 9. November 2017 Autor Geschrieben 9. November 2017 Am 9.11.2017 um 13:25 schrieb Mttkrb: Gehst du allerdings nicht den Weg über die CurrentCulture, musst du dich komplett selbst drum kümmern und deine Strings und Formatierungen alle selbst im ViewModel hinterlegen. Ein anderen Wege kenne ich zumindest gerade nicht. Aufklappen Genau das ist der Punkt. Im Moment habe ich ein Tool, das alle Zeichenfolgen im XAML in ResourceDictionary packt. Dort stehen dann die zugehörigen Übersetzungen drin. Ändere ich einen Eintrag im ResourceDictionary (dies passiert auch beim Änderun der Sprache), wird dann die GUI aktualisiert. Mir widerstrebt nur im Moment, dass ich die Liste im ViewModel je nach Sprache zusammenbauen muss. Ich dachte eher an soetwas: xaml: <array> <item group="common" text="englishNamedParameter" value="{Binding myParameter1}" unit="s" stringformat="f3" /> <item ... /> </array> somit würde die automatische Übersetzung wieder passen. Nur soetwas bekomme ich momentan nicht an das DataGrid gebunden.
Mttkrb Geschrieben 9. November 2017 Geschrieben 9. November 2017 Dann könnte man doch per MultiBinding und passendem Converter sich die Ausgabe zusammenbasteln. Das sieht nicht wirklich schön aus, könnte aber reichen. <TextBlock> <TextBlock.Text> <MultiBinding MultiValueConverter="{StaticResource CustomLocalizingConverter}"> <Binding> <Binding.Source> <sys:String>common</sys:String> </Binding.Source> </Binding> <Binding> <Binding.Source> <sys:String>englishNamedParameter</sys:String> </Binding.Source> </Binding> <Binding Path="myParameter1"/> <Binding> <Binding.Source> <sys:String>s</sys:String> </Binding.Source> </Binding> <Binding> <Binding.Source> <sys:String>f3</sys:String> </Binding.Source> </Binding> </MultiBinding> </TextBlock.Text> </TextBlock> Oder Du erstellst dir ein eigenes TextBlockControl, dass die Parameter entgegen nimmt und daraus den gewünschten Text anzeigst. <own:MyCustomTextBlock group="common" text="englishNamedParameter" value="{Binding myParameter1}" unit="s" stringformat="f3"/> Dieses Control wird anschließend als Template in das Grid eingefügt.
steinadler Geschrieben 9. November 2017 Autor Geschrieben 9. November 2017 Am 9.11.2017 um 13:52 schrieb Mttkrb: Oder Du erstellst dir ein eigenes TextBlockControl, dass die Parameter entgegen nimmt und daraus den gewünschten Text anzeigst. <own:MyCustomTextBlock group="common" text="englishNamedParameter" value="{Binding myParameter1}" unit="s" stringformat="f3"/> Dieses Control wird anschließend als Template in das Grid eingefügt. Aufklappen Sowas wird es wohl werden müssen. Nur benötige ich dann ja für jeden einzelnen Parameter eine entsprechende MyCustomTextBlock-Instanz. An ein DataGrid kann man soweit ich weiß nicht ein Template je Zeile binden. Wollte halt gern ein DataGrid, um - ähnlich wie beim VS-Eigenschaftenfenster - das schön gruppieren zu können.
Mttkrb Geschrieben 9. November 2017 Geschrieben 9. November 2017 Pro Zeile wird das Template nicht gesetzt. Höchstens pro Spalte :-D <DataGrid Name="myGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTemplateColumn Header="englishNamedParameter"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <own:MyCustomTextBlock group="common" text="englishNamedParameter" value="{Binding myParameter1}" unit="s" stringformat="f3"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
Mttkrb Geschrieben 9. November 2017 Geschrieben 9. November 2017 Ich würde aber die Bezeichnung, Wert und die Einheit in jeweils eine Spalte aufteilen. Dann steht am Ende alles schön untereinander.
steinadler Geschrieben 9. November 2017 Autor Geschrieben 9. November 2017 (bearbeitet) Dann habe ich in jeder Zeile und in jeder Spalte den Wert des Parameters1 stehen, oder? Bearbeitet 9. November 2017 von steinadler
Mttkrb Geschrieben 9. November 2017 Geschrieben 9. November 2017 den jeweiligen Wert, ja. Also Wenn das Binding von ItemsSource des DataGrid an z.B. folgende Collection "MyGridItems" gesetzt ist und dies wie folgt definiert ist: public class MyListItem { public double myParameter1 {get;set;} } .... IEnumerable<MyListItem> MyGridItems = ...
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden