C# WPF选定值,显示成员路径与列表框和组合框不一致
我有一个名为C# WPF选定值,显示成员路径与列表框和组合框不一致,c#,wpf,C#,Wpf,我有一个名为DropDownIndividuals()的存储过程,它是使用LINQ创建的。 存储过程返回FullName和Case\u Number。我想将SelectedValuePath设置为存储过程中的Case\u Number列。这就是我为一个列表框所做的,并且它是有效的 private void listBox1_Loaded(object sender, RoutedEventArgs e){ using (ToolboxDataContext toolboxDB = new
DropDownIndividuals()
的存储过程,它是使用LINQ创建的。
存储过程返回FullName
和Case\u Number
。我想将SelectedValuePath
设置为存储过程中的Case\u Number
列。这就是我为一个列表框所做的,并且它是有效的
private void listBox1_Loaded(object sender, RoutedEventArgs e){
using (ToolboxDataContext toolboxDB = new ToolboxDataContext())//this is linq in action
{
var x = toolboxDB.DropDownIndividuals().ToList();//convert to a list
listBox1.ItemsSource = x; //bind the data
listBox1.SelectedValuePath = "Case_Number";
listBox1.DisplayMemberPath = "FullName";
Console.WriteLine(listBox1.SelectedValue.ToString());
//Result:it shows the case number of the person the user picks.
}
}
现在我对下拉组合框做同样的事情,但它不起作用
private void individualDropDown_Loaded(object sender, RoutedEventArgs e)
{
using (ToolboxDataContext toolbox = new ToolboxDataContext())
{
var individualDropDownBox = toolbox.DropDownIndividuals().ToList();
individualDropDown.ItemsSource = individualDropDownBox;
individualDropDown.DisplayMemberPath = "FullName";
individualDropDown.SelectedValuePath = "Case_Number";
Console.WriteLine(individualDropDown.SelectedValue.ToString());
}
}
为什么??我怎样才能解决这个问题?为什么这么混乱?您甚至没有按相同的顺序设置属性,这相当于:
…并显示与预期相同的ID
编辑:在启动时,两个控件的选定值都是
null
。为什么如此混乱?您甚至没有按相同的顺序设置属性,这相当于:
…并显示与预期相同的ID
编辑:在启动时,两个控件的选定值都是
null
。您是正确的,在列表框
和组合框
的选定值
处理方式之间存在排序不一致。对于列表框
,加载时,如果它具有焦点,则SelectedValue
将对应于数据源中的第一项。对于组合框
,即使它有焦点并且数据源提供项目,默认的SelectedValue
也将在加载的事件处理程序中取消设置
这种行为是故意的。要使组合框
的行为类似于列表框设置组合框,请选择索引至“0”
,在XAML中定义组合框 您是正确的,对于ListBox
和ComboBox
处理SelectedValue
的方式存在排序不一致。对于列表框
,加载时,如果它具有焦点,则SelectedValue
将对应于数据源中的第一项。对于组合框
,即使它有焦点并且数据源提供项目,默认的SelectedValue
也将在加载的事件处理程序中取消设置
这种行为是故意的。要使组合框
的行为类似于列表框设置组合框,请选择索引至“0”
,在XAML中定义组合框 试试这个:
MetroAreaList metroAreaList = _presenter.GetMetroArea();
foreach (MetroArea metroArea in metroAreaList) {
lstMetroArea.DisplayMemberPath = "Name";
lstMetroArea.SelectedValuePath = "ID";
lstMetroArea.Items.Add(metroArea);
}
它正在工作……试试这个:
MetroAreaList metroAreaList = _presenter.GetMetroArea();
foreach (MetroArea metroArea in metroAreaList) {
lstMetroArea.DisplayMemberPath = "Name";
lstMetroArea.SelectedValuePath = "ID";
lstMetroArea.Items.Add(metroArea);
}
它正在工作……您的班级应该是公开的:
public class Place
{
public string Name { get; set; }
public string Id { get; set; }
}
foreach (var y in Lists)
{
listBox1.DisplayMemberPath = "Name";
listBox1.SelectedValuePath = "Id";
// Console.WriteLine(y.Case_Number.ToString());
listBox1.Items.Add(y);
}
你的班级应该是公开的:
public class Place
{
public string Name { get; set; }
public string Id { get; set; }
}
foreach (var y in Lists)
{
listBox1.DisplayMemberPath = "Name";
listBox1.SelectedValuePath = "Id";
// Console.WriteLine(y.Case_Number.ToString());
listBox1.Items.Add(y);
}
“不行”你可以做得更好。什么不起作用?你以为会发生什么,结果又发生了什么?如果你解释问题,人们会更有可能提供帮助(并且能够更好地提供帮助)。好的,当我从组合框中选择某人时,它应该显示案例编号。例如:组合框有两个值“Jay”和“Rodrigo”。如果我选择Jay,它会在控制台上显示他的病例编号。假设他的案例号是54444。它做什么呢?它说对象引用没有设置为行控制台的对象实例。WriteLine(individualDropDown.SelectedValue.ToString());无论如何,只要知道如何将displaymemberpath和selectedvaluepath添加到组合框以及如何访问其中的值就足够了。“不起作用”您可以做得更好。什么不起作用?你以为会发生什么,结果又发生了什么?如果你解释问题,人们会更有可能提供帮助(并且能够更好地提供帮助)。好的,当我从组合框中选择某人时,它应该显示案例编号。例如:组合框有两个值“Jay”和“Rodrigo”。如果我选择Jay,它会在控制台上显示他的病例编号。假设他的案例号是54444。它做什么呢?它说对象引用没有设置为行控制台的对象实例。WriteLine(individualDropDown.SelectedValue.ToString());无论如何,只要知道如何向组合框添加displaymemberpath和selectedvaluepath以及如何访问其中的值就足够了。我仍然遇到对象引用问题,请注释掉调试语句,然后运行程序。组合框是否选择第一个名称?为
individualDropDown\u SelectionChanged
添加处理程序以查看更改的发生。我仍然遇到对象引用问题,请注释掉调试语句,然后运行程序。组合框是否选择第一个名称?为individualDropDown\u SelectionChanged
添加一个处理程序以查看更改的发生。在itemsource中,如果我有一个名为toolbox的linq类,它的StoredProcess名为dropdownindividuals(),我是否将Name=“lbData”ItemsSource=“{Binding toolbox}”?这将不起作用,要绑定到通过方法调用检索的一组对象,您可以使用。好的,我想我将研究对象数据提供程序,看看这会给我带来什么。我不明白为什么我必须使用xaml,我不能只绑定individualDropDown.DisplayMemberPath=“FullName”;直接从codebehind。它不应该真的有什么区别。这个XAML可能只是不关心该值在任何时候是否为null
。我只是想说明,到目前为止,我没有任何问题/看不出有什么不同。为什么不在调用ToString()
之前检查null?(编辑:我刚检查过,两个控件的开头都是SelectedValue==null
)是的,它将是null,因为如果我有一个名为toolbox的linq类,它的StoredProcess名为DropDownPersons(),我是否放置Name=“lbData”ItemsSource=”从itemsource中的sql Server获取数据{Binding Toolbox}”??绑定到一组对象时,这不起作用