Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置组合框的选定值_C#_.net_Wpf - Fatal编程技术网

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定义为属性