ComboBox, связанный с ObservableCollection, не обновляется - PullRequest
1 голос
/ 12 августа 2011

У меня есть 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. Другие периоды выборки будут свернуты.

Ответы [ 3 ]

0 голосов
/ 13 августа 2011

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

   CollectionViewSource.GetDefaultView(lbFields.ItemsSource).Refresh();
0 голосов
/ 13 августа 2011

Если ваш период и ваша частота содержатся в одном классе, почему бы не раскрыть список доступных периодов?Затем вы можете использовать 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;
    }
}
0 голосов
/ 12 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...