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 中的 SelectedValuePath
和 DisplayMemberPath
:
<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />
我在 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 中的 SelectedValuePath
和 DisplayMemberPath
:
<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />