Zum Inhalt springen

Lokalisierung in View oder in ViewModel


Empfohlene Beiträge

Geschrieben (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 von steinadler
Geschrieben (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 von Mttkrb
Geschrieben
  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.

Geschrieben

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.

Geschrieben
  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.

Geschrieben

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>
Geschrieben

Ich würde aber die Bezeichnung, Wert und die Einheit in jeweils eine Spalte aufteilen. Dann steht am Ende alles schön untereinander.

Geschrieben

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 = ...

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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Weiterlesen  

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...