Привязка WPF ComboBox к пользовательскому списку

Я уже понял это:

const object1 = {
        un: inp.value,
        pw: inpw.value
    };
    var myJSON = JSON.stringify(object1);

    document.getElementById('val').innerHTML = myJSON;

Вывод: {"un": "erin", "pw": "pdds"}

174
задан Peter Mortensen 19 April 2018 в 13:22
поделиться

3 ответа

Вы устанавливаете DisplayMemberPath и SelectedValuePath для "Называния", таким образом, я предполагаю, что у Вас есть класс PhoneBookEntry с Именем общественной собственности.

Вы установили DataContext на свой объект ConnectionViewModel?

я скопировал Вас код и сделал некоторые незначительные модификации, и это, кажется, хорошо работает. Я могу установить свойство viewmodels PhoneBookEnty и выбранный пункт в изменениях поля комбинированного списка, и я могу изменить выбранный пункт в поле комбинированного списка, и свойство моделей PhoneBookEntry представления установлено правильно.

Вот мое содержание XAML:

<Window x:Class="WpfApplication6.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
<Grid>
    <StackPanel>
        <Button Click="Button_Click">asdf</Button>
        <ComboBox ItemsSource="{Binding Path=PhonebookEntries}"
                  DisplayMemberPath="Name"
                  SelectedValuePath="Name"
                  SelectedValue="{Binding Path=PhonebookEntry}" />
    </StackPanel>
</Grid>
</Window>

И вот мой код - позади:

namespace WpfApplication6
{

    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            ConnectionViewModel vm = new ConnectionViewModel();
            DataContext = vm;
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ((ConnectionViewModel)DataContext).PhonebookEntry = "test";
        }
    }

    public class PhoneBookEntry
    {
        public string Name { get; set; }

        public PhoneBookEntry(string name)
        {
            Name = name;
        }

        public override string ToString()
        {
            return Name;
        }
    }

    public class ConnectionViewModel : INotifyPropertyChanged
    {
        public ConnectionViewModel()
        {
            IList<PhoneBookEntry> list = new List<PhoneBookEntry>();
            list.Add(new PhoneBookEntry("test"));
            list.Add(new PhoneBookEntry("test2"));
            _phonebookEntries = new CollectionView(list);
        }

        private readonly CollectionView _phonebookEntries;
        private string _phonebookEntry;

        public CollectionView PhonebookEntries
        {
            get { return _phonebookEntries; }
        }

        public string PhonebookEntry
        {
            get { return _phonebookEntry; }
            set
            {
                if (_phonebookEntry == value) return;
                _phonebookEntry = value;
                OnPropertyChanged("PhonebookEntry");
            }
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        public event PropertyChangedEventHandler PropertyChanged;
    }
}

Редактирование: Geoffs второй пример, кажется, не работает, который кажется немного нечетным мне. Если я изменяю свойство PhonebookEntries на ConnectionViewModel, чтобы быть ReadOnlyCollection типа, привязка TwoWay свойства SelectedValue на поле комбинированного списка хорошо работает.

, Возможно, существует проблема с CollectionView? Я заметил предупреждение в выходной консоли:

Система. Windows. Данные, Предупреждающие: 50: Используя CollectionView непосредственно не полностью поддерживается. Работа основных характеристик, хотя с некоторой неэффективностью, но расширенными функциями может встретиться с известными ошибками. Рассмотрите использование производного класса для предотвращения этих проблем.

Edit2 (.NET 4.5): содержание DropDownList может быть основано на ToString () а не DisplayMemberPath, в то время как DisplayMemberPath указывает участника для выбранного и отображенного объекта только.

183
ответ дан Peter Mortensen 23 November 2019 в 20:32
поделиться

У меня была проблема, которая сначала казалась идентичной, но она оказалась из-за проблемы совместимости NHibernate / WPF. Проблема была вызвана тем, как WPF проверяет равенство объектов. Я смог заставить свои вещи работать, используя свойство идентификатора объекта в свойствах SelectedValue и SelectedValuePath.

<ComboBox Name="CategoryList"
          DisplayMemberPath="CategoryName"
          SelectedItem="{Binding Path=CategoryParent}"
          SelectedValue="{Binding Path=CategoryParent.ID}"
          SelectedValuePath="ID">

См. Сообщение в блоге от Честера, WPF ComboBox - SelectedItem, SelectedValue и SelectedValuePath с NHibernate , подробнее.

23
ответ дан 23 November 2019 в 20:32
поделиться

Для привязки данных к ComboBox

List<ComboData> ListData = new List<ComboData>();
ListData.Add(new ComboData { Id = "1", Value = "One" });
ListData.Add(new ComboData { Id = "2", Value = "Two" });
ListData.Add(new ComboData { Id = "3", Value = "Three" });
ListData.Add(new ComboData { Id = "4", Value = "Four" });
ListData.Add(new ComboData { Id = "5", Value = "Five" });

cbotest.ItemsSource = ListData;
cbotest.DisplayMemberPath = "Value";
cbotest.SelectedValuePath = "Id";

cbotest.SelectedValue = "2";

ComboData выглядит следующим образом:

public class ComboData
{ 
  public int Id { get; set; } 
  public string Value { get; set; } 
}
71
ответ дан 23 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: