![](/img/trans.png)
[英]ComboBox SelectedValue or SelectedItem Binding WPF 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;
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"
}
]
}
最终工作代码,由 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 中的SelectedValuePath
和DisplayMemberPath
:
<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.