簡體   English   中英

設置組合框的選定值

[英]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指定的屬性等於myObjPayee對象(這肯定是完全沒有對象),沒有找到這樣的對象,因此清除了選擇。

更新:

設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM