2011-08-12 4 views
1

У меня есть ComboBox, который использует ObservableCollection как источник. У меня есть источник связаны следующимComboBox, связанный с 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, но 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

Почему StaticResource, а не просто назвать собственности? – sll

+0

Изменения в TrackVis или выбранном индексе или в обоих случаях? – Tyrsius

+0

Очень важно, задавая такой вопрос, чтобы быть конкретным о том, что не обновляется. Новые элементы не отображаются в 'ComboBox', когда вы добавляете их в коллекцию? Является ли 'SelectedIndex' не обновляющимся при изменении связанного свойства в коде? Что конкретно происходит и не происходит? –

ответ

0

Вы пытаетесь отслеживать индекс выборки. то вы должны привязываться к объекту, у которого есть такое свойство, и реализует INotifyPropertyChanged.Or, как я уже сказал, распространять это событие на объект, являющийся вашим источником привязки, и поднять на нем правильный propertychanged. В противном случае механизм привязки ничего не знал об изменениях этого свойства. Привязать к CollectionControl.Settings с микросхемой Path = SamplingFrequencyIndex

+0

Когда я добавляю path = propertyWithChangeNotification, конвертер TrackVis никогда не вызывается. –

+0

По собственности с уведомлением об изменении я имею в виду свойство, которое изменяется в вашей ситуации. Это свойство находилось в объекте «test»? – objectbox

+0

В VisualStudio перейдите к представлению view>. Когда вы отлаживаете свое приложение, есть ли какие-либо ошибки привязки в выходе? – objectbox

0

SamplingPeriods необходимо реализовать INotifyPropertyChanged и вам нужно вызвать NotifyPropertyChanged на съемочной площадке. Я возьму его на веру в CollectionControl.Settings.SamplingFrequencyIndex держит значение, которое вы ожидаете от своего кода, неясно, где вы это устанавливаете. Когда вы меняете SamplingFrequencyIndex, вам нужно вызвать NotifyPropertyChanged на ObservabaleCollection, чтобы вызвать силовое обновление. Там должен быть лучший способ сделать это. Измените SamplingPeriods и передайте ссылку на SamplingFrequencyIndex, чтобы те объекты, которые вы хотите изменить, измените.

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

вы заставили меня думать вместе с Эйбом, и я решил пойти другим путем. Я создал CollectionViewSource и фильтр. Затем, когда событие SamplingFrequencyIndex запущено, я принудительно создаю view.refresh для CollectionViewSource. Прекрасно работает! Спасибо и за то, что заложили меня на этом пути. –

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; 
    } 
} 
Смежные вопросы