我在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#中,我有一个部分来创建组合框:
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。
绑定不适用于组合框,在这里我在做什么错?
编辑:我的模型在下面是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来自以下模型:
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; }
}
}
将订单模型设置为页面dataContext的C#:
pageData = JsonConvert.DeserializeObject<OrderResponse>(JsonString);
DataContext = pageData;
HOWEVR,如果我更改数据库和订单。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
属性。
您还应该foreach
通过设置来替换循环ItemsSource
:
cmbPrefContact.ItemsSource = contactPrefData.ContactPrefs;
...以及XAML中的SelectedValuePath
和DisplayMemberPath
:
<ComboBox x:Name="cmbPrefContact" ... SelectedValuePath = "contactPrefID" DisplayMemberPath = "ContactType" />
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句