2009-06-17 84 views
1

在下面的代碼示例,但是,您可以從德國將滑塊移動到英文,看到文本塊會轉換在運行時:爲什麼WPF綁定更新字符串而不是對象?

  • 只綁定到 TextBlock的被更新
  • 的TextBlock的綁定到詞典得到更新

看來,簡單地查看得到迪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> 

視圖模型:

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"); 
      } 

     } 


    } 
} 
+0

可能值得指出的是,這不是WPF本地化的很好策略。爲您的本地化字符串使用資源而不是將它們存儲在字典中更爲常見和有用。有一篇關於CodeProject的文章(http://www.codeproject.com/KB/WPF/WPFLocalize.aspx),它展示了一個在運行時改變資源文件語言的好方法。 – 2009-06-17 10:06:58

回答

1

您需要使用一個ObservableCollection <>代替。

當發生更改時,必須通知WPF綁定器,當設置dictionary屬性時調用OnPropertyChanged,但還需要一些通知綁定器字典內部值已更改的原因。一個ObservableCollection <>會爲你做到這一點。當項目從集合中添加/刪除時,它會引發事件。

+0

我可以實現Observable集合而不是字典,但是我怎樣才能用「綁定翻譯[add]」中的鍵將對象從可觀察集合中拉出來,因爲我想將集合中的對象綁定到TextBlock而不是例如列表顯示。 – 2009-06-17 09:59:58

2

您需要等同於ObservableList,但對於Dictionary。框架中默認沒有一個,但描述寫入方法的一篇文章可以找到here.

您的代碼現在無法正常工作的原因是因爲您觸發了NotifyPropertyChanged事件由於你的FillTranslations方法不會創建一個新的Dictionary,所以setter不會被調用,並且事件不會被觸發。我想你可以避開ObservableDictionary類,如果你創建了一個新的字典並分配它,這又會觸發事件並重新綁定整個列表,但是從長遠來看,保留相同字典實例並通知控件該集合已通過Observable模式進行了更改(在字典中實現INotifyCollectionChanged)

相關問題