#c# #wpf #combobox #binding
#c# #wpf #combobox #привязка
Вопрос:
У меня есть модель в WPF, которую я привязываю к окну.
pageData
содержит все мои данные и включает одно поле:
pageData.orders.PrefContact
В тестах на странице это значение заполняется моделью (целое число 1-> 4)
У меня есть этот XAML:
<Label Content="Last Name" Grid.Column="2" Grid.Row="0" Margin="0,10,0,0" HorizontalAlignment="Right"/>
<TextBox x:Name="txtLastName" Text="{Binding Path = order.LastName}" Grid.Column="3" Grid.Row="0" Margin="10,10,0,0" Width="200" HorizontalAlignment="Left"
TabIndex="1" LostFocus="txtLastName_LostFocus" />
<Label Content="Contact Method" Grid.Column="2" Grid.Row="1" Margin="0,10,0,0" HorizontalAlignment="Right"/>
<ComboBox x:Name="cmbPrefContact" SelectedValue="{Binding Path = order.PrefContact}" SelectionChanged="cmbPrefContact_SelectionChanged" Grid.Column="3"
Width="200" Grid.Row="1" Margin="10,10,0,0" HorizontalAlignment="Left"
TabIndex="3" Height="37" VerticalAlignment="Top" />
В этом случае текстовое поле txtLastName заполняется правильно, мы надеемся, показывая, что модель правильно подключена к XAML.
В моем C # у меня есть раздел для создания combobox:
private void bindCmbPref(int cmbpref)
{
var client = new RestClient("http://XXX.XXX.XXX:3000/comboData/contactPrefData");
client.Timeout = -1;
var request = new RestRequest(Method.GET);
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
var JsonString = response.Content;
var contactPrefData = JsonConvert.DeserializeObject<contactPrefData>(JsonString);
foreach (var contactPrefs in contactPrefData.ContactPrefs)
{
cmbPrefContact.Items.Add(contactPrefs);
cmbPrefContact.SelectedValuePath = "contactPrefID";
cmbPrefContact.DisplayMemberPath = "ContactType";
}
//cmbPrefContact.SelectedValue = cmbpref;
}
Я создал его таким образом, чтобы быть честным…Я еще не понимаю всю модель / MVVM, и через несколько часов я отказался от нее. (на данный момент).
Я надеялся создать комбинацию таким образом, но затем установить комбинацию, используя привязку, как мои текстовые поля, однако она не работает.
Если я разрешу конечному коду работать выше в коде c #, я могу установить SelectedValue, используя переменную, которая берется из PageData.orders .Предварительный контакт.
Что я здесь делаю не так, что привязка не работает для combobox?
РЕДАКТИРОВАТЬ: моя модель ниже для contactPrefs, которая является результатом JSON из созданного мной API.
public partial class contactPrefData
{
public bool Result { get; set; }
public List<contactPrefs> ContactPrefs { get; set; }
public partial class contactPrefs
{
public int contactPrefID { get; set; }
public string ContactType { get; set; }
}
}
Мои данные страницы взяты из этой модели:
public partial class OrderResponse
{
public bool Result { get; set; }
public Order order { get; set; }
public partial class Order
{
public long OrderId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public int PrefContact { get; set; }
public string ItemName { get; set; }
public int ItemQuantity { get; set; }
public string Plu { get; set; }
public string ModelNumber { get; set; }
}
}
C #, где модель заказа устанавливается на страницу DataContext:
pageData = JsonConvert.DeserializeObject<OrderResponse>(JsonString);
DataContext = pageData;
ОДНАКО, если я изменюсь в DB и order.PrefContact = 2:
ТЕКУЩАЯ РАБОЧАЯ СИТУАЦИЯ: C#:
cmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;
cmbPrefContact.SelectedValuePath = "contactPrefID";
cmbPrefContact.DisplayMemberPath = "ContactType";
XAML:
<ComboBox x:Name="cmbPrefContact"
SelectedValue="{Binding Path = order.PrefContact}"
SelectedValuePath ="contactPrefID"
DisplayMemberPath ="contactType"
SelectionChanged="cmbPrefContact_SelectionChanged" Grid.Column="3"
Width="200" Grid.Row="1" Margin="10,10,0,0" HorizontalAlignment="Left"
TabIndex="3" Height="37" VerticalAlignment="Top" />
Итак, теперь я думаю, я не уверен, зачем мне нужно указывать пути к элементу отображения и значениям в C # И XAML … но если я уберу один из них с обеих сторон, он перестанет работать!
Это мои контактные данные prefs, загружаемые в combobox:
{
"Result": true,
"contactPrefs": [
{
"contactPrefID": 1,
"ContactType": "SMS"
},
{
"contactPrefID": 2,
"ContactType": "Phone Call"
},
{
"contactPrefID": 3,
"ContactType": "Email"
},
{
"contactPrefID": 4,
"ContactType": "None"
}
]
}
Окончательный рабочий код, разработанный mm8:
XAML:
<ComboBox x:Name="cmbPrefContact"
SelectedValue="{Binding Path = order.PrefContact}"
SelectedValuePath ="contactPrefID"
DisplayMemberPath ="ContactType"
SelectionChanged="cmbPrefContact_SelectionChanged" Grid.Column="3"
Width="200" Grid.Row="1" Margin="10,10,0,0" HorizontalAlignment="Left"
TabIndex="3" Height="37" VerticalAlignment="Top" />
C#:
var JsonString = response.Content;
var contactPrefData = JsonConvert.DeserializeObject<contactPrefData>(JsonString);
cmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;
Комментарии:
1. Привяжите
SelectedValue
свойство, предполагая, чтоorder.PrefContact
этоint
:SelectedValue="{Binding Path = order.PrefContact}"
. Не могли бы вы опубликовать пример того, где и какLastName
PrefContact
определяются свойства and .2. И, конечно, set
SelectedValuePath
иDisplayMemberPath
в XAML.3. Кроме того, вместо того, чтобы перебирать
contactPrefData.ContactPrefs
и устанавливать элементы один за другим, просто установитеcmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;
4. черт возьми, я действительно выбрал ЗНАЧЕНИЕ, а не item, я просто пробовал ITEM, прежде чем публиковать здесь, поскольку значение тоже не работало.
5. @Clemens Я изменил их, как было предложено, спасибо, но выбранное значение =»{Путь привязки = order.PrefContact}» не сработало, я действительно пробовал это раньше и теперь изменил его обратно
Ответ №1:
Вы должны привязать SelectedValue
свойство к int
исходному свойству:
<ComboBox x:Name="cmbPrefContact" SelectedValue="{Binding order.PrefContact}" ... />
SelectedItem
предполагается, что он привязан к contactPrefs
свойству.
Вы также должны заменить foreach
цикл, установив ItemsSource
:
cmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;
…и SelectedValuePath
и DisplayMemberPath
в XAML:
<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />
Комментарии:
1. черт возьми, я действительно выбрал ЗНАЧЕНИЕ, а не item, я просто пробовал ITEM, прежде чем публиковать здесь, поскольку значение тоже не работало.
2. Что такое
order
?3. Я только что добавил код для раздела order . порядок — это .. вложенный список внутри моего json! Извините, я не знаю терминологии. Суть моего вопроса в том, что раздел
4. Какое значение
order.PrefContact
? Присутствует ли это значение вComboBox
?5. Вы можете опустить
Path =
. Вы можете привязатьItemsSource
кIEnumerable<contactPrefs>
свойству.