Dans l'exemple de code suivant, vous pouvez déplacer le curseur de l'allemand vers l'anglais et de voir ce bloc de texte se traduit à l'exécution, cependant:Pourquoi la liaison WPF met-elle à jour les chaînes mais pas les objets?
- seul le TextBlock lié à une chaîne est mis à jour
- la TextBlock lié à un Dictionnairen'a pas soient mis à jour
Il semble que la vue simplement obtient le Di objet ctionary une fois et puis ne met plus à jour. J'ai essayé Mode = TwoWay mais cela n'a aucun effet.
Que dois-je faire pour que les éléments liés aux objets soient mis à jour via la liaison?
Vue:
<Window x:Class="TestObjectUpdate234.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:TestObjectUpdate234.Commands"
Title="Main Window" Height="400" Width="800">
<StackPanel Margin="10">
<TextBlock Text="{Binding TranslationEdit}" />
<TextBlock Text="{Binding Translations[add], Mode=TwoWay}" />
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" Margin="0 20 0 0">
<TextBlock Text="English" Margin="0 0 5 0"/>
<Slider Name="TheLanguageIndexSlider"
Minimum="0"
Maximum="1"
IsSnapToTickEnabled="True"
Width="100"
Margin="5"
Value="{Binding LanguageIndex}"
HorizontalAlignment="Left"/>
<TextBlock Text="German" Margin="5 0 0 0"/>
</StackPanel>
</StackPanel>
</Window>
ViewModel:
using System.Collections.Generic;
namespace TestObjectUpdate234.ViewModels
{
public class MainViewModel : ViewModelBase
{
#region ViewModelProperty: TranslationEdit
private string _translationEdit;
public string TranslationEdit
{
get
{
return _translationEdit;
}
set
{
_translationEdit = value;
OnPropertyChanged("TranslationEdit");
}
}
#endregion
#region ViewModelProperty: Translations
private Dictionary<string, string> _translations = new Dictionary<string, string>();
public Dictionary<string, string> Translations
{
get
{
return _translations;
}
set
{
_translations = value;
OnPropertyChanged("Translations");
}
}
#endregion
#region ViewModelProperty: LanguageIndex
private int _languageIndex;
public int LanguageIndex
{
get
{
return _languageIndex;
}
set
{
_languageIndex = value;
OnPropertyChanged("LanguageIndex");
FillTranslations();
}
}
#endregion
public MainViewModel()
{
_languageIndex = 0; //english
FillTranslations();
}
private void FillTranslations()
{
if (_languageIndex == 0)
{
TranslationEdit = "Edit";
Translations.Clear();
Translations.Add("add", "Add");
}
else
{
TranslationEdit = "Bearbeiten";
Translations.Clear();
Translations.Add("add", "Hinzufügen");
}
}
}
}
Il est peut-être intéressant de souligner que ce n'est pas une bonne stratégie pour la localisation WPF. Il est beaucoup plus commun et utile d'utiliser des ressources pour vos chaînes localisées plutôt que de les stocker dans un dictionnaire. Il y a un article sur CodeProject (http://www.codeproject.com/KB/WPF/WPFLocalize.aspx) qui montre un bon moyen de changer la langue du fichier de ressources à l'exécution. –