我已经对此进行了一些搜索,但似乎没有什么可以完全找到我正在寻找的答案。基本上我在组合框中有一个组合框和一个对象。我想将组合框的值设置为对象的值。
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
我在想,这可能与组合框中的Payee对象与myObj的内存位置不同有关,但我不知道如何克服这个问题。
修改
这是ComboBox的填充方式
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>
答案 0 :(得分:2)
为了达到你想要的效果,你可以做到
cbPayee.SelectedItem = myObj;
当你这样做时
cbPayee.SelectedValue = myObj;
发生的事情是.NET搜索Payee
对象,ComboBox.SelectedValuePath
指定的属性等于myObj
(这肯定不是对象),发现没有这样的对象,结果清除了选择。
<强>更新强>
设置SelectedItem
应该只是“正常工作”:如果对象位于Items
集合中,则会被选中。这里需要注意的是,在搜索对象时,WPF默认使用引用相等。如果您想为此方案提供自己的相等性测试,则需要Payee
实施IEquatable<Payee>
。如果它不适合您,请仔细检查您确实是指同一个实例(或实现IEquatable
)。
另外,如果你这样做:
cbPayee.SelectedValuePath = "Name";
cbPayee.SelectedValue = "Jack Smith";
然后组合框应选择Payee
实例,其Name
等于您指定的实例。在实践中,这与实现IEquatable<Payee>
非常相似,方法是将实现与Name
的值进行比较。
究竟是什么对你不起作用?
答案 1 :(得分:0)
我刚试过这个,它对我有用。它是一般概念代码,但我希望它有所帮助。
MyView.xaml
<StackPanel>
<ComboBox Name="cbPayee" ItemsSource="{Binding Payees}" DisplayMemberPath="Name" SelectedValuePath="ID" />
<Button Click="Button_Click" Content="Click me" />
</StackPanel>
MyView.cs
public MyView()
{
InitializeComponent();
LoadItems();
DataContext = this;
}
public IEnumerable<Payee> Payees { get; set; }
private void LoadItems()
{
Payees = PayeeManager.GetPayees();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
cbPayee.SelectedValue = new Payee(2, "Steve").ID;
}
Payee.cs
public class Payee
{
public int ID { get; set; }
public string Name { get; set; }
public Payee() { }
public Payee(int id, string name)
{
ID = id;
Name = name;
}
}
从技术上讲,我建议您使用MVVM方法,其中视图模型用作View的数据上下文,但这应该可以帮助您找到正确的方向。
答案 2 :(得分:-1)
在这种情况下,我认为您需要使用Payee对象中的“selectedvalue”覆盖.ToString()
答案 3 :(得分:-1)
您正在使用SelectedValue而不是SelectedItem,因此您的=运算符匹配对象的属性,该属性与您的ComboBox的ValueMember匹配,而不是对象的地址。
如果您正在使用内部/静态对象列表,您会注意到SelectedValue始终为NULL。如果你绑定了ComboBox的DataSource,那么你可以设置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( ... )
),那么你将不得不使用类似的东西(不设置ComboBox的DisplayMember / ValueMember属性:
cbPayee.Text = myObj.ToString();
答案 4 :(得分:-1)
你可以采取两种不同的方法:
你可以为属性定义组合框的ValueMember,当它被赋予一个值(通常是实体的id)时,它应该寻找:
comboBox.ValueMember = "PayeeID";
现在当你给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的DataSource时,这种方法对我有用,而且我不确定它是否适合您(Items.Add())
comboBox.DataSouce = new List(){new Payee {/ some properties /}};