Wpf 运行时的数据网格本地化

Wpf 运行时的数据网格本地化,wpf,datagrid,localization,Wpf,Datagrid,Localization,我正在使用本地化和MarkupExtension,如中所示。 到目前为止,一切都很顺利 唯一不起作用的是DataGrid内容在运行时的本地化。 例如,我有一个绑定到observableCollection的datagrid。它包含一个显示要素名称的文本列。功能名称应可本地化 <DataGridTextColumn Header="{t:Translator Feature}" IsReadOnly="True" Binding="{Binding Path=Feature, Conve

我正在使用本地化和MarkupExtension,如中所示。 到目前为止,一切都很顺利

唯一不起作用的是DataGrid内容在运行时的本地化。 例如,我有一个绑定到observableCollection的datagrid。它包含一个显示要素名称的文本列。功能名称应可本地化

<DataGridTextColumn Header="{t:Translator Feature}" IsReadOnly="True"
  Binding="{Binding Path=Feature, Converter={Utilities:EnumDescriptionConverter}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
问题是,只有在第一次填充datagrid时才会调用转换器。当当前区域性更改时,datagrid内容永远不会更改


如何让datagrid内容在当前语言每次更改时都进行更新?

我通过让ViewModel监听LanguageChangedEvents来解决这个问题。eventhandler对(数据网格的)基础数据视图调用Refresh(),并触发PropertyChangedEvents

private void OnLanguageChanged(object sender, EventArgs args)
{
  //call refresh in order to update the translations within the list
  IEditableCollectionView list = (ListCollectionView) this.FeaturesView;
  if (list.IsEditingItem) list.CommitEdit();
  if (list.IsAddingNew) list.CommitNew();
  this.FeaturesView.Refresh();
  OnPropertyChanged(FeaturesViewProperty);

  ...
}

在Christians Mosers Wpf教程的评论中,有人提到使用转换器时动态语言切换不起作用的事实。也许你可以耍点小把戏:使用多重绑定从另一个属性获得属性更改?你的意思是像触发器一样?我的意思是:假设属性a的绑定确实更新了;物业B没有。您可以使用多重绑定(a+B),只需确保到B的绑定将被更新(您有点像是挂接到a PropertyChanged事件)。它不是一个真正的触发器,但当a被更新时,它将触发B的更新。
private void OnLanguageChanged(object sender, EventArgs args)
{
  //call refresh in order to update the translations within the list
  IEditableCollectionView list = (ListCollectionView) this.FeaturesView;
  if (list.IsEditingItem) list.CommitEdit();
  if (list.IsAddingNew) list.CommitNew();
  this.FeaturesView.Refresh();
  OnPropertyChanged(FeaturesViewProperty);

  ...
}