XAML ComboBox по умолчанию SelectedIndex не отображается

У меня есть ComboBox с некоторыми значениями, и я хочу, чтобы сразу две вещи работали.

Вот мой ComboBox, и я хочу показать 10 как значение по умолчанию, а также привязать его к двойнику? Расстояние собственности.

<combobox grid.row="5" grid.column="1" selectedindex="1" selectedvalue="{Binding Distance, Mode=TwoWay, Converter={StaticResource ***********************}}">
 <comboboxitem>1</comboboxitem>
 <comboboxitem isselected="True">10</comboboxitem>
 <comboboxitem>100</comboboxitem>
 <comboboxitem>1000</comboboxitem>
</combobox>

И вот конвертер:

public class *********************** : IValueConverter
{
 public object Convert(object value, Type targetType, object parameter, string language)
 {
 return null;
 }

 public object ConvertBack(object value, Type targetType, object parameter, string language)
 {
 ComboBoxItem item = value as ComboBoxItem;

 if (item != null)
 {
 ****** d;
 if (******.TryParse(item.Content.ToString(), out d))
 return d;
 }

 return null;
 }
}

Проблема в том, что в этом коде выбранный элемент 10 не отображается в начале приложения. Если я удалю строку с конвертером, тогда она отобразит выбранный элемент 10, но тогда я не могу привязать его к двойнику? Расстояние собственности. Я не хочу писать код для него, например: Convert.********(combobox1.SelectedValue)...

Что я могу сделать, чтобы обе работали?

1 ответ

Вам нужно заполнить элементы combo box из ViewModel. Кроме того, вы не должны использовать свойство SelectedValue, вместо него вы должны использовать SelectedItem. См. Приведенный ниже код.

XAML

ViewModel

public class viewModel : INotifyPropertyChanged
{
 public viewModel()
 {
 DistanceCollection = new ObservableCollection<string> 
 {
 "1",
 "10",
 "100",
 "1000"
 };

 Distance = ******.Parse(DistanceCollection[1].ToString());
 }

 public ObservableCollection<string> DistanceCollection { get; set; }

 private ****** _Distance;
 public ****** Distance
 {
 get 
 { 
 return _Distance; 
 }
 set
 {
 _Distance = value;
 OnPropertyChanged("Distance");
 }
 }

 public event PropertyChangedEventHandler PropertyChanged;

 protected void OnPropertyChanged(string propertyName = null)
 {
 var eventHandler = this.PropertyChanged;
 if (eventHandler != null)
 {
 eventHandler(this, new PropertyChangedEventArgs(propertyName));
 }
 }
}
</string></string>

конвертер

public class *********************** : IValueConverter
{
 public object Convert(object value, Type targetType, object parameter, string language)
 {
 return value.ToString();
 }

 public object ConvertBack(object value, Type targetType, object parameter, string language)
 {
 string item = value as string;

 if (!string.IsNullOrWhiteSpace(item))
 {
 ****** d;
 if (******.TryParse(item, out d))
 return d;
 }

 return null;
 }
}

licensed under cc by-sa 3.0 with attribution.