В выпадающем списке не отображаются определенные отрицательные числа

#c# #wpf #material-design-in-xaml

#c# #wpf #material-design-in-xaml

Вопрос:

Не могу объяснить, почему отрицательные числа от -1 до -8 не будут отображаться в моем combobox . Я просмотрел отдельные номера, и только те, которые были упомянуты, не работают. Все остальные числа, отрицательные и положительные, кажутся нормальными. Любые подсказки приветствуются.

XAML:

 <ComboBox Grid.Row="2" Grid.Column="1" md:HintAssist.Hint="Degrees" MinWidth="72" Margin="16 0 0 0"
        ItemsSource="{Binding LongtitudeRange}"
        Style="{StaticResource MaterialDesignFloatingHintComboBox}">
  <ComboBox.Text>
    <Binding Path="Long1" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
      <Binding.ValidationRules>
        <domain:NotEmptyValidationRule ValidatesOnTargetUpdated="True"/>
      </Binding.ValidationRules>
    </Binding>
  </ComboBox.Text>
  <ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel />
    </ItemsPanelTemplate>
  </ComboBox.ItemsPanel>
</ComboBox>
  

Конструктор виртуальной машины..

 LongtitudeRange = new List<int>(Enumerable.Range(-179, 359));
  

Свойство, я проверил, r имеет правильный номер.

 public IList<int> LongtitudeRange { get; }
public double Long1
{
    get
    {
        var l = Conversions.DoubleToDegreeString(SkyServer.Longitude);
        var lsplit = l.Split(':');
        var r = Convert.ToDouble(lsplit[0]);
        return r;
    }
    set
    {
        var l = Conversions.DegreeToDouble(value, Long2, Long3);
        if (Math.Abs(l - SkyServer.Longitude) < 0.00001) return;
        SkyServer.Longitude = l;
        OnPropertyChanged();
    }
}
  

Я вызываю это из другого метода, чтобы инициировать обновление OnPropertyChanged($"Long1");

Комментарии:

1. Почему вы привязываете текстовое свойство ComboBox к текстовому свойству? Разве вы не хотите просто выбрать целочисленное значение долготы из выпадающего списка? И разве не должно быть 360 значений вместо 359? Также обратите внимание на опечатку в LongtitudeRange

2. И вместо того, чтобы разбирать строку deg / min / sec, вам лучше напрямую получать значения из SkyServer.Longitude с помощью арифметики с плавающей запятой.

3. Изменение на индекс или значение дает тот же результат. 360 недопустимо, так как 179 59 59 — это максимальное значение. Спасибо за опечатку!

4. Итак, возвращаясь к моему первоначальному вопросу, почему вы привязываете свойство Text в ComboBox, когда SelectedItem это дало бы вам соответствующее значение целого градуса долготы? И есть ли в выпадающем списке пустые строки вместо чисел от -1 до -8 или они просто отсутствуют? Это трудно воспроизвести.

5. Безусловно, именно так работает ваш механизм получения свойств Long1. Вы должны отладить его и, как уже было сказано, рассмотреть возможность его реализации без преобразования строк.