2013-12-18 69 views
2

我在Windows應用商店應用中的Combobox綁定中遇到了一個小問題。它必須綁定到本地化的枚舉值(枚舉名稱是BackgroundTrack)。我在視圖模型中有兩個屬性 - 項目列表和選定的項目。我使用Tuple <>來保存枚舉值及其本地化的字符串表示。在Windows應用商店中爲Combobox SelectedItem實現雙向綁定

物業所選的項目,VM:

public Tuple<BackgroundTrack, String> SelectedBackgroundTrack 
{ 
    get 
    { 
     return _selectedBackgroundTrack; 
    } 

    set 
    { 
     if (_selectedBackgroundTrack == null || 
      _selectedBackgroundTrack.Equals(value)) 
     { 
      _selectedBackgroundTrack = value; 
      _settingsService.BackgroundTrack = value.Item1; 
      RaisePropertyChanged("SelectedBackgroundTrack"); 
     } 
    } 
} 

物業項目列表中的VM:

public IEnumerable<Tuple<BackgroundTrack, String>> BackgroundTrackList { get; set; } 

組合框綁定:

  <ComboBox 
      ItemsSource="{Binding Path=BackgroundTrackList}" 
      SelectedItem="{Binding Path=SelectedBackgroundTrack, Mode=TwoWay}" 
      Grid.Row="10" ItemTemplate="{StaticResource DataTemplate1}" 
      /> 
      <DataTemplate x:Key="DataTemplate1"> 
      <Grid> 
       <TextBlock Text="{Binding Item2}"/> 
      </Grid> 
      </DataTemplate> 

視圖模型構造:

BackgroundTrackList = EnumUtils.GetLiterals<BackgroundTrack>(); 
SelectedBackgroundTrack = BackgroundTrackList.First(t => t.Item1.Equals(_settingsService.BackgroundTrack)); 

問題:我在ViewModel的構造函數中設置了選定的項目(從應用程序設置),但是這個值不顯示在組合框中 - 它沒有任何選擇。如果我在combobbox中選擇了一些東西,綁定就能正常工作並設置底層的ViewModel屬性。我如何糾正這個問題?我是否需要實現INotifyPropertyChanged或以編程方式推遲所選項目屬性的設置?

+0

確保獲得SelectedItem屬性時,您的ItemsSource被加載,否則你必須實施INPC和引發事件通知UI屬性已更改SelectedItem。 –

+0

我已經實現了INPC,並且我在構造函數中觸發了setter,將屬性更改。仍然組合框在開始時有空的選擇。 (問題已更新) – Cortlendt

回答

0

您不能同時設置SelectedItemSelectedValuePath

如果您正在使用SelectedItem,remove SelectedValuePath,它將按預期工作。

+0

我已根據您的建議實施更改,但仍無效。我更新了問題代碼以反映這些更改。 – Cortlendt

+0

不要刪除'DisplayMemberPath'。只刪除'SelectedValuePath'。需要'DisplayMemberPath'才能在組合框中顯示選定的文本。 –

+0

我已經測試過 - still luck 。 – Cortlendt

1

您需要實施IEquatable<T>該項目使用的類型。 Tuple不。

相關問題