繁体   English   中英

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

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

我在 WPF 中有一个 model,我将其绑定到 window。

pageData

保存我的所有数据并包含一个字段:

pageData.orders.PrefContact

在页面上的测试中,这是由 model(整数 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 被正确填充,希望显示 model 正确连接到 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# 代码中运行,我可以使用从 pageData.orders.PrefContact 获取的变量设置 SelectedValue。

我在这里做错了什么,绑定不适用于 combobox?

编辑:我的 model 位于contactPrefs 下方,这是我制作的 API 中的 JSON 的结果。

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


    }

我的 pageData 来自这个 model:

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# 其中订单 model 设置为页面数据上下文:

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 中指定显示成员和值路径......但如果我在任一侧拿走其中一个,它就会停止工作!

这是我的联系人首选项数据正在加载到 combobox 中:

{
    "Result": true,
    "contactPrefs": [
        {
            "contactPrefID": 1,
            "ContactType": "SMS"
        },
        {
            "contactPrefID": 2,
            "ContactType": "Phone Call"
        },
        {
            "contactPrefID": 3,
            "ContactType": "Email"
        },
        {
            "contactPrefID": 4,
            "ContactType": "None"
        }
    ]
}

数据库 infoo 显示 prefContact 的 id

最终工作代码,由 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" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM