Поле со списком выбранных значений не задается в binding XAML, но работает на C#

#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;
 

Если order.PrefContact = 1:
введите описание изображения здесь
введите описание изображения здесь

ОДНАКО, если я изменюсь в 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> свойству.