[英]Set selected value of a combo box
我已經對此進行了一些搜索,但是似乎沒有什么能完全找到我要的答案。 基本上,我有一個組合框和組合框中的一個對象。 我想將組合框的值設置為對象的值。
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不同的內存位置有關,但是我不確定如何克服這個問題。
編輯
這就是組合框的填充方式
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搜索具有ComboBox.SelectedValuePath
指定的屬性等於myObj
的Payee
對象(這肯定是完全沒有對象),沒有找到這樣的對象,因此清除了選擇。
更新:
設置SelectedItem
應該只是“正常工作”:如果對象位於Items
集合中,則將其選中。 需要注意的是,在搜索對象時,WPF默認情況下將使用引用等式 。 如果要為此情況提供自己的相等性測試,則需要讓Payee
實現IEquatable<Payee>
。 如果對您不起作用,請仔細檢查您是否確實在引用同一實例(或實現IEquatable
)。
另外,如果您這樣做:
cbPayee.SelectedValuePath = "Name";
cbPayee.SelectedValue = "Jack Smith";
然后組合框應選擇其Name
與您指定的Name
相同的Payee
實例。 在實踐中,這非常類似於通過讓實現比較Name
的值來實現IEquatable<Payee>
。
到底什么對您不起作用?
我剛剛測試過,它對我有用。 這是通用的概念代碼,但希望對您有所幫助。
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方法,其中視圖模型用作視圖的數據上下文,但這應該為您提供正確的方向。
在這種情況下,我認為您需要在Payee對象中使用“ selectedvalue”覆蓋.ToString()
您使用的是SelectedValue而不是SelectedItem,因此您的=運算符與匹配ComboBox的ValueMember的對象屬性(而不是對象的地址)匹配。
如果使用內部/靜態對象列表,則會注意到SelectedValue始終為NULL。 如果要綁定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( ... )
),則必須使用類似的方法(無需設置ComboBox的DisplayMember / ValueMember屬性:
cbPayee.Text = myObj.ToString();
您可以采用兩種不同的方法:
您可以為屬性定義組合框的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 {/ 一些屬性 /}};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.