ComboBox WPF + ObservableCollection<>()

203
11 мая 2018, 09:32

В общем есть ComboBox в который нужно передать значения через binding из ObservableCollection. Пробовал сделать так, но выводит "First.Model.Workers". Подскажите в чем проблема и как это исправить?

.xaml

<ComboBox Margin="100,10" Height="30" Width="100" ItemsSource="{Binding Path=Workers}"/>

.cs

namespace First.Models
{
    public class MainWindowViewModel : ViewModelBase
    {
        private ObservableCollection<Worker> _workers;
        public MainWindowViewModel()
        {
            Workers = new ObservableCollection<Worker>()
            {
                new Worker {Name = "Сергей", Number = "+375(29)999-99-99", Pay = 5000},
                new Worker {Name = "Вячеслав", Number = "+375(29)888-88-88", Pay = 4000},
                new Worker {Name = "Франц", Number = "+375(29)777-77-77", Pay = 3000}
            };
        }
        public ObservableCollection<Worker> Workers
        {
            get => _workers;
            set
            {
                if (Equals(value, _workers)) return;
                _workers = value;
                RaisePropertyChanged(nameof(Workers));
            }
        }
    }
    public class Worker
    {
        public string Name { get; set; }
        public string Number { get; set; }
        public int Pay { get; set; }
    }
}
Answer 1

Ваша проблема:

<ComboBox Margin="100,10" Height="30" Width="100" SelectedItem="{Binding Path=Workers}"/>

Вы задали привязку коллекции на выделенный элемент, т.е. как пример результат выбора элемента пользователем.

Для того что бы вывести данные в ComboBox вам необходимо привязать коллекцию элементов на поле ItemsSource.

<ComboBox Margin="100,10" Height="30" Width="100" ItemsSource="{Binding Path=Workers}"/>

Но, тут есть одно но, когда вы привяжите коллекцию, то в ComboBox'e вы увидите подобие: First.Models.Worker. Для того что бы вывести какие-то данные, вам необходимо будет задать для ComboBox DataTemplate о котором я надеюсь вы знаете.

Для решения проблемы вывода данных в каждый элемент ComboBox есть несколько решений, самое подходящее вы должны придумать сами.

  1. Задать DataTemplate для элементов ComboBox
  2. Переопределить метод ToString() класса Worker.
  3. Написать свой контрол, который сможет без преобразований и всего подобного работать с вашими данными.

Самое простое это переопределение метода ToString:

public class Worker
{
    public string Name { get; set; }
    public string Number { get; set; }
    public int Pay { get; set; }
    public override string ToString()
    {
         // Данные не являются такими как нужны вам, придумайте сами как хотите их выводить.
         return string.Format("{0}, {1}, {2}", Name, Number, Pay);
    }
}

Задать DataTemplate, тут потребуется поработать с xaml ComboBox'a:

<ComboBox Margin="100,10" Height="30" Width="100" ItemsSource="{Binding Path=Workers}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <!--[ Пример является примитивным и служит лишь для показа ]-->
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding StringFormat="{0}, {1}, {2}">
                        <Binding Path="Name" />
                        <Binding Path="Number" />
                        <Binding Path="Pay" />
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Ну контрол для сего я не стану писать, это муторно и отнимает много времени.

READ ALSO
Проблемы с наследованием в классах C#

Проблемы с наследованием в классах C#

Имеется сейчас два класса- один базовый, другой наследуется от первогоКод первого класса:

235
TopMost не работает в Windows CE 6.0 (Micros Workstation 5.0)

TopMost не работает в Windows CE 6.0 (Micros Workstation 5.0)

Создаю приложения для терминала Micros Workstation 5 (Windows CE 60)

216
Изменение роли без переавторизации

Изменение роли без переавторизации

У пользователя А несколько ролей, одна из которых "viewer"Удаляю роль:

215
C# авторизация в программе

C# авторизация в программе

Есть статический метод, принимающий значений логина и пароля и возвращающий из базы данных конкретного пользователя

242