2012-08-23 68 views
1

我正在使用像Christians Mosers Wpf tutorial中的MarkupExtension的本地化。 到目前爲止,一切工作都很好。DataGrid在運行時本地化

唯一不起作用的是運行時DataGrid內容的本地化。 例如我有一個綁定到observableCollection的數據網格。它包含一個顯示功能名稱的TextColumn。功能名稱應該是可本地化的。

<DataGridTextColumn Header="{t:Translator Feature}" IsReadOnly="True" 
    Binding="{Binding Path=Feature, Converter={Utilities:EnumDescriptionConverter}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/> 

該功能是一個枚舉值,我用轉換器檢索它的描述。轉換器也做翻譯。

public object Convert(object value, System.Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if (value is Enum) 
    { 
    var myEnum = (Enum)value; 
    string description = GetEnumDescription(myEnum); 
    return TranslationManager.Instance.Translate(description); 
    } 

    return value; 
} 

問題是轉換器只在datagrid第一次被填充時被調用。當前文化發生變化時,數據網格內容不會改變。

如何在每次當前語言更改時更新數據網格內容?

+0

在Christians Mosers Wpf教程的評論中,有人提到動態語言切換在使用轉換器時不起作用的事實。也許你可以欺騙一點:使用multibinding從另一個屬性獲取PropertyChanged? – franssu

+0

你的意思是像一個觸發器? – tabina

+0

我的意思是:假設屬性A的綁定確實更新;物業B沒有。您可以使用多重綁定(A + B),只要確保綁定到B將會被更新(您可以掛鉤到A PropertyChanged事件)。這不是真正的觸發器,但是當A將被更新時,它將觸發B的更新。 – franssu

回答

0

我解決了它,讓我的ViewModel監聽LanguageChangedEvents。事件處理程序在數據網格的底層數據視圖上調用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); 

    ... 
}