none
Установка начального значения в ComboBox (WPF MVVM) RRS feed

  • Вопрос

  • Здравствуйте!

    Помогите пожалуйста разобраться с таким вопросом: при загрузке окна считываю данные из файла в ObservableCollection, которую, в свою очередь прикручиваю к ComboBox. После загрузки окна, в ComboBox автоматически выбирается первое значение. А мне нужно, чтобы не было выбрано ничего, если количество элементов в коллекции более одного, и был выбран тот единственный, если он в коллекции один. Подскажите пожалуйста, как добиться такого поведения? Хотя бы чтобы не было выбрано ни одного элемента? В тестовом приложении всё ок, но там формирование данных коллекции происходит в конструкторе при создании самой коллекции:

      public ViewModel()
      {
       Models = new ObservableCollection<Model>() {
    	new Model() { ID = 1, TestName = "One" },
    	new Model() { ID = 2, TestName = "Two" },
    	new Model() { ID = 3, TestName = "Three" },
    	new Model() { ID = 4, TestName = "Four" } };
      }
    

    А в итоговом идет загрузка из файла и добавление элементов в коллекцию в цикле (foreach) методом Add.

    Вот разметка ComboBox приложения:

    <ComboBox IsEditable="True"
    						  x:Name="PersonComboBox"
    						  IsTextSearchEnabled="True"
    						  IsSynchronizedWithCurrentItem="True"
    						  IsTextSearchCaseSensitive="False"
    						  Visibility="{Binding Path=PersonListHasItems, Converter={StaticResource VConverter}}"
    						  VerticalAlignment="Center"
    						  Text="{Binding NewPerson, UpdateSourceTrigger=PropertyChanged}"
    						  ItemsSource="{Binding Persons}"
    						  SelectedValue="{Binding SelectedPerson}"
    						  DisplayMemberPath="PersonName"
    						  TextSearch.TextPath="PersonName"
    						  StaysOpenOnEdit="True"
    						  SelectionChanged="PersonNameComboBox_SelectionChanged"
    						  Margin="2"
    					  
    				</ComboBox>

    Вот фрагмент ViewModel:

    public KnownUserViewModel() { Users = new ObservableCollection<KnownUser>(); GetData(); } void GetData() { if (!File.Exists(PersonFileName)) return; XDocument PersonConfig = XDocument.Load(ConfigFileName); foreach (XElement item in PersonConfig.Root.Elements("person").Where(i => !i.Elements().Any(n => n.Name == "fired"))) Users.Add(new KnownPerson() { ID = item.Attribute("ID").Value, PersonName = item.Attribute("name").Value }); SelectedPerson = null; // <= Эти две строки я добавил уже в попытке удалить выбор элемента при старте, не помогло почему-то NewPerson = string.Empty; } public KnownPerson SelectedPerson { get { return _selectedPerson; } set { if (_selectedPerson != value) { _selectedPerson = value; OnPropertyChanged(); } } } public string NewPerson { get { return _newPerson; } set { if (value != _newPerson) { _newPerson = value; OnPropertyChanged(); } } }


    Артемий Соболев

    12 апреля 2017 г. 3:01

Ответы

  • Добрый день, Артемий.

    После цикла проверяете сколько у вас элементов в коллекции и присваиваете в зависимости от результата в SelectedPerson значение первого элемента коллекции или null. Возможно, еще придется заменить SelectedValue на SelectedItem.

    12 апреля 2017 г. 5:45
    Отвечающий

Все ответы