2011-08-12 48 views
1

我有一個使用ObservableCollection作爲源的組合框。我已綁定作爲源如下綁定到ObservableCollection的組合框不會更新

<ComboBox IsEditable="False" 
      SelectedIndex="{Binding Source={x:Static Properties:CollectionControl.Settings}, Path=SamplingPeriodIndex, Mode=TwoWay}" 
      SelectionChanged="onPeriodControlSelectionChanged" 
      Name="PeriodControl" 
      ItemsSource="{StaticResource test}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding SamplingPeriod}" Visibility="{Binding Converter={StaticResource TrackVis}, ConverterParameter=GroupIndex}"/> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

TrackVis是確定如果元素是可見的或摺疊,這取決於已INotifyPropertyChanged的實現的外部特性的轉換器。

一切正常,第一次ComboBox顯示,但組合框永遠不會刷新,以反映變化。我一定錯過了一些東西,但截至目前,我所嘗試過的一切都失敗了。

這裏是轉換器

public class IsVisibleConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     var tempObj = (SamplingPeriods) value; 
     if (tempObj.GroupIndex >= CollectionControl.Settings.SamplingFrequencyIndex) 
     { 
      return Visibility.Visible; 
     } 

     return Visibility.Collapsed; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
      throw new NotImplementedException(); 
    } 
} 

另外的代碼,這裏是收集

public class PeriodsCollection : ObservableCollection<SamplingPeriods> 
{ 
    public PeriodsCollection() 
    { 
     Add(new SamplingPeriods("1/16 of a second", 13)); 
     Add(new SamplingPeriods("1/8 of a second", 12)); 
     Add(new SamplingPeriods("1/4 of a second", 11)); 
     Add(new SamplingPeriods("1/2 of a second", 10)); 
     Add(new SamplingPeriods("1 second", 9)); 
     Add(new SamplingPeriods("2 seconds", 8)); 
     Add(new SamplingPeriods("4 seconds", 7)); 
     Add(new SamplingPeriods("8 seconds", 6)); 
     Add(new SamplingPeriods("16 seconds", 5)); 
     Add(new SamplingPeriods("32 seconds", 4)); 
     Add(new SamplingPeriods("64 seconds", 3)); 
     Add(new SamplingPeriods("128 seconds", 2)); 
     Add(new SamplingPeriods("256 seconds", 1)); 
     Add(new SamplingPeriods("512 seconds", 0)); 
    } 
} 

public class SamplingPeriods 
{ 
    public SamplingPeriods(string samplingPeriod, int groupIndex) 
    { 
     SamplingPeriod = samplingPeriod; 
     GroupIndex = groupIndex; 
    } 

    public string SamplingPeriod { get; private set; } 
    public int GroupIndex { get; private set; } 
} 

的想法是,所選擇的採樣頻率限制了可用的採樣週期。採樣頻率指數範圍從0到11.例如,如果採樣索引是9,則只有有效採樣週期將具有GroupIndex> = 9.其他採樣週期將被摺疊。

+0

爲什麼靜態資源,而不是簡單地命名的財產? – sll

+0

對TrackVis或selectedindex或兩者的更改? – Tyrsius

+0

當問這樣的問題時,確實非常重要的是要具體說明什麼不是更新。將新項目添加到集合時,新項目是否不會出現在「ComboBox」中?當您更改代碼中的綁定屬性時,「SelectedIndex」不會更新嗎?具體而言,現在和現在都沒有發生什麼? –

回答

0

您正在嘗試跟蹤採樣頻率指數。那麼您必須將綁定到具有此屬性的對象並實現INotifyPropertyChanged.Or,正如我已經說過的那樣,將此事件傳播到作爲綁定源的對象,並在其上引發正確的屬性更改。否則,綁定引擎將不知道該屬性的變化。 綁定到CollectionControl.SettingsPath = SamplingFrequencyIndex

+0

當我添加path = propertyWithChangeNotification時,TrackVis轉換器永遠不會被調用。 –

+0

通過財產與更改通知我的意思是改變你的情況的財產。這個屬性是否駐留在「測試」對象中? – objectbox

+0

在VisualStudio中,轉到視圖>輸出。當你調試你的應用程序時,輸出中是否有綁定錯誤? – objectbox

0

SamplingPeriods需要實現INotifyPropertyChanged的,你需要調用NotifyPropertyChanged上設定。我會在CollectionControl.Settings.SamplingFrequencyIndex上保留你期望從你的代碼中得到的值,並且不清楚你設置的位置。當你改變SamplingFrequencyIndex時,你需要在ObservabaleCollection上調用NotifyPropertyChanged來強制刷新。有一個更好的方法來做到這一點。更改SamplingPeriods並將參考傳遞給SamplingFrequencyIndex,以便更改要更改的實際對象。

CollectionViewSource.GetDefaultView(lbFields.ItemsSource).Refresh(); 
+0

你讓我和安倍一起思考,我決定採用不同的方法。我創建了一個CollectionViewSource和一個過濾器。然後,當SamplingFrequencyIndex事件被觸發時,我強制CollectionViewSource的view.refresh。很棒!感謝兩人爲我設定這條道路。 –

0

如果您的期間和您的頻率都在同一個班級舉行,爲什麼不公開可用期的列表呢?然後,您可以使用的CollectionView來篩選集合,而不是轉換器&知名度:

// initialize in your constructor 
public PeriodsCollection AvailablePeriods { get; private set; } 

public int SamplingFrequencyIndex 
{ 
    get { return samplingFrequencyIndex; } 
    set 
    { 
     samplingFrequencyIndex = value; 
     RaisePropertyChanged("SamplingFrequencyIndex"); 
     var view = CollectionViewSource.GetDefaultView(AvailablePeriods) as ListCollectionView; 
     view.Filter = o => ((SamplingPeriod)o).GroupIndex >= value; 
    } 
} 
相關問題