Я уже понял это:
const object1 = {
un: inp.value,
pw: inpw.value
};
var myJSON = JSON.stringify(object1);
document.getElementById('val').innerHTML = myJSON;
Вывод: {"un": "erin", "pw": "pdds"}
Вы устанавливаете 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 указывает участника для выбранного и отображенного объекта только.
У меня была проблема, которая сначала казалась идентичной, но она оказалась из-за проблемы совместимости 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 , подробнее.
Для привязки данных к 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; }
}