steinadler Geschrieben 9. November 2017 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 9. November 2017 Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 9. November 2017 Autor Teilen Geschrieben 9. November 2017 vor 2 Minuten 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. 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 9. November 2017 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 9. November 2017 Autor Teilen Geschrieben 9. November 2017 vor 1 Minute 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. 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 9. November 2017 Teilen 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> Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 9. November 2017 Teilen 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
steinadler Geschrieben 9. November 2017 Autor Teilen 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Mttkrb Geschrieben 9. November 2017 Teilen 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 = ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.