设置组合框的选定值

时间:2010-11-26 14:26:43

标签: 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 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>

5 个答案:

答案 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 /}};