Combobox SelectedValue 未在绑定 XAML 中设置,但在 C# 中有效

Combobox SelectedValue not being set in binding XAML but works in C#

我在 WPF 中有一个模型,我绑定到 window。

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# 中,我有一个用于创建组合框的部分:

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

老实说,我以这种方式创建它...我还不理解整个 model/MVVM 事情,几个小时后就放弃了。 (目前)。 我希望以这种方式创建组合,但随后像我的文本框一样使用绑定设置组合,但它不起作用。

如果我允许结束代码在 c# 代码中运行,我可以使用从 pageData.orders.PrefContact.

中获取的变量设置 SelectedValue

绑定不适用于组合框,我做错了什么?

编辑: 下面是我的 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:

HOWEVR 如果我更改数据库并且 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 中指定显示成员和值路径...但是如果我从任一侧拿走其中一个,它就会停止工作!

这是我的联系人偏好数据正在加载到组合框中:

{
    "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;

您应该将 SelectedValue 属性 绑定到 int 来源 属性:

<ComboBox x:Name="cmbPrefContact" SelectedValue="{Binding order.PrefContact}" ... />

SelectedItem 应该绑定到 contactPrefs 属性.

您还应该通过设置 ItemsSource:

来替换 foreach 循环
cmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;

...以及 XAML 中的 SelectedValuePathDisplayMemberPath

<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />