В следующем примере кода, вы можете переместить ползунок с немецкого на английский и посмотреть, что текстовый блок переводятся во время выполнения, однако:Почему WPF Binding обновляет строки, но не объекты?
- только TextBlock привязан к строке получает обновленный
- TextBlock привязан к словарьне получить обновленный
кажется, что View просто получает Di объект ctionary один раз, а затем больше не обновляется. Я пробовал Mode = TwoWay, но это не влияет.
Что мне нужно для того, чтобы элементы, связанные с объектами ? получить обновление через привязку?
Вид:
<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");
}
}
}
}
Возможно, стоит отметить, что это не очень хорошая стратегия для локализации WPF. Это гораздо более распространено и полезно использовать ресурсы для ваших локализованных строк, а не хранить их в словаре. Существует статья о CodeProject (http://www.codeproject.com/KB/WPF/WPFLocalize.aspx), которая показывает хороший способ изменить язык файла ресурсов во время выполнения. –