C# 设置组合框的选定值
我已经对此做了一些搜索,但似乎没有什么能完全符合我所寻找的答案。基本上我有一个组合框和组合框中的一个对象。我想将组合框的值设置为对象的值C# 设置组合框的选定值,c#,.net,wpf,C#,.net,Wpf,我已经对此做了一些搜索,但似乎没有什么能完全符合我所寻找的答案。基本上我有一个组合框和组合框中的一个对象。我想将组合框的值设置为对象的值 ComboBox cbPayee; // populate with a bunch of "Payee" objects Payee myObj; // this is my payee object which I get from my database cbPayee.SelectedValue = myObj // this is what I'd
ComboBox cbPayee;
// populate with a bunch of "Payee" objects
Payee myObj; // this is my payee object which I get from my database
cbPayee.SelectedValue = myObj // this is what I'd like to do, but it doesn't work
我想这可能与组合框中的收款人对象与myObj的内存位置不同有关,但我不确定如何克服这个问题
编辑
这就是组合框的填充方式
foreach(Payee payee in PayeeManager.GetPayees())
{
cbPayee.Items.Add(payee);
}
编辑#2
我是WPF的新手,所以可能我的绑定设置不正确
<Window x:Class="Budget.TransactionWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="New Transaction" Height="450" Width="450" Loaded="Window_Loaded">
<Window.Resources>
<DataTemplate x:Key="PayeeOutput" DataType="Budget.LINQ.Payee">
<StackPanel Margin="0 0 0 0" Orientation="Horizontal">
<TextBlock FontWeight="bold" Text="{Binding Path=Name}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<ComboBox Height="25" HorizontalAlignment="Left" Margin="73,50,0,0" Name="cbPayee" VerticalAlignment="Top" Width="300" ItemTemplate="{StaticResource PayeeOutput}" />
</Grid>
</Window>
要实现您想要的,您可以这样做
cbPayee.SelectedItem = myObj;
当你这样做的时候
cbPayee.SelectedValue = myObj;
发生的情况是.NET搜索带有组合框指定属性的收款人对象。SelectedValuePath
等于myObj
(很可能根本不是对象),找不到这样的对象,结果清除了选择
更新:
设置SelectedItem
应该只是“仅工作”:如果对象在Items
集合中,它将被选中。这里的一个警告是,在搜索对象时,WPF默认使用引用相等。如果您想为此场景提供自己的平等性测试,则需要让收款人
实现IEquatable
。如果它不适用于您,请仔细检查您是否确实引用了相同的实例(或实现IEquatable
)
此外,如果您这样做:
cbPayee.SelectedValuePath = "Name";
cbPayee.SelectedValue = "Jack Smith";
然后,组合框应选择收款人
实例,其名称
等于您指定的名称。实际上,这非常类似于通过让实现比较Name
的值来实现IEquatable
到底是什么对你不起作用?要实现你想要的,你可以这样做
cbPayee.SelectedItem = myObj;
当你这样做的时候
cbPayee.SelectedValue = myObj;
发生的情况是.NET搜索带有组合框指定属性的收款人对象。SelectedValuePath
等于myObj
(很可能根本不是对象),找不到这样的对象,结果清除了选择
更新:
设置SelectedItem
应该只是“仅工作”:如果对象在Items
集合中,它将被选中。这里的一个警告是,在搜索对象时,WPF默认使用引用相等。如果您想为此场景提供自己的平等性测试,则需要让收款人
实现IEquatable
。如果它不适用于您,请仔细检查您是否确实引用了相同的实例(或实现IEquatable
)
此外,如果您这样做:
cbPayee.SelectedValuePath = "Name";
cbPayee.SelectedValue = "Jack Smith";
然后,组合框应选择收款人
实例,其名称
等于您指定的名称。实际上,这非常类似于通过让实现比较Name
的值来实现IEquatable
到底是什么对您不起作用?在这种情况下,我认为您需要在受款人对象中用“selectedvalue”覆盖.ToString()在这种情况下,我认为您需要在受款人对象中用“selectedvalue”覆盖.ToString()您使用的是selectedvalue而不是SelectedItem,因此,=运算符匹配的对象属性与组合框的ValueMember匹配,而不是对象的地址
如果您使用的是内部/静态对象列表,您会注意到SelectedValue总是空的。如果要绑定组合框的数据源,则可以设置SelectedValue=myObj.MyProperty,其中MyProperty与组合框的ValueMember相同
例如:
cbPayee.DisplayMember = "Name";
cbPayee.ValueMember = "ID";
cbPayee.DataSource = myPayeeCollection; // or SqlDataReader, or whatever
...
cbPayee.SelectedValue = myObj.ID;
如果您使用的是内部/静态项目列表(即通过cbPayee.items.Add(…)
),则必须使用以下内容(不设置组合框的DisplayMember/ValueMember属性:
cbPayee.Text = myObj.ToString();
您使用的是SelectedValue而不是SelectedItem,因此=运算符匹配的对象属性与组合框的ValueMember而不是对象的地址匹配
如果使用的是内部/静态对象列表,您会注意到SelectedValue始终为空。如果绑定ComboBox的数据源,则可以设置SelectedValue=myObj.MyProperty,其中MyProperty与ComboBox的ValueMember相同
例如:
cbPayee.DisplayMember = "Name";
cbPayee.ValueMember = "ID";
cbPayee.DataSource = myPayeeCollection; // or SqlDataReader, or whatever
...
cbPayee.SelectedValue = myObj.ID;
如果您使用的是内部/静态项目列表(即通过cbPayee.items.Add(…)
),则必须使用以下内容(不设置组合框的DisplayMember/ValueMember属性:
cbPayee.Text = myObj.ToString();
您可以采取两种不同的方法:
第一个:
您可以将组合框的ValueMember定义为属性,当给它一个值(通常是实体的id)时,它应该查找:
现在,当您给comboBox一个类似4的值时,它将在列表中搜索一个值为4的对象
第二种方法:
重写收款人的Equal()方法,以说明两个实体是如何相同的:
public override Equal(object obj)
{
if (obj is Payee)
return ((obj as Payee).PayeeID == this.PayeeID;
else
return false;
}
现在,可以执行以下操作从列表中选择对象:
comboBox.SelectedItem = wantedPayee;
comboBox使用Equal方法从其内部列表中获取要选择的实体
记住:当您不重写相等时,默认实现(AFAIK)将比较引用以确定相等
最后,我应该说,当我手动设置ComboBox的数据源时,这种方法对我是有效的,我不确定它是否按照您的方式工作(Items.Add())
comboBox.DataSouce=new List(){new paye{/some properties/};您可以采用两种不同的方法:
第一个:
可以将组合框的ValueMember定义为属性