C# 绑定组合框MVVM

C# 绑定组合框MVVM,c#,wpf,mvvm,C#,Wpf,Mvvm,这是我第一次尝试绑定combobox。我正在尝试从数据库中获取值。但是,通过下面的代码,我得到了这样的结果(结果数与我的表的行数相同): GUITest.DB.Structure 其中GUITest->我的项目的名称空间,DB->structure.cs所在的文件夹 private ObservableCollection<Structure> _lists; public ObservableCollection<Structure> Lists {

这是我第一次尝试绑定combobox。我正在尝试从数据库中获取值。但是,通过下面的代码,我得到了这样的结果(结果数与我的表的行数相同):

GUITest.DB.Structure

其中GUITest->我的项目的名称空间,DB->structure.cs所在的文件夹

private ObservableCollection<Structure> _lists;
    public ObservableCollection<Structure> Lists
    {
        get { return _lists; }
        set
        {
            _lists = value;
            NotifyOfPropertyChange("Lists");
        }
    }

    public ObservableCollection<Structure> GetStructures()
    {
       ObservableCollection<Structure> products  = new ObservableCollection<Structure>();
        using (SqlConnection conn =
            new SqlConnection(ConfigurationManager.ConnectionStrings["StringConnexion"].ConnectionString))
        {
            conn.Open();

            SqlCommand cmdNotes =
                new SqlCommand("SELECT * FROM Structure", conn);


            using (SqlDataReader reader = cmdNotes.ExecuteReader())
            {

                var ordinals = new
                {
                    CodeStr = reader.GetOrdinal("CODE_STR"),
                    NomStr = reader.GetOrdinal("NOM_STR"),

                };

                while (reader.Read())
                {

                    var temp = new TableStructure();

                    temp.CodeStr = reader.GetString(ordinals.CodeStr);
                    temp.NomStr = reader.GetString(ordinals.NomStr);

                    products.Add(temp.SqlProduct2Product());
                }
            }
        }
        return products;  
    }

    public CreateAccountViewModel()
    {
        _lists = new ObservableCollection<Structure>();
        Lists = GetStructures();
    }
private observedcollection\u列表;
公共可观测收集列表
{
获取{返回_列表;}
设置
{
_列表=值;
财产变更通知(“清单”);
}
}
公共可观测集合GetStructures()
{
ObservableCollection products=新的ObservableCollection();
使用(SqlConnection-conn)=
新的SqlConnection(ConfigurationManager.ConnectionString[“StringConnexion”].ConnectionString))
{
conn.Open();
SqlCommand cmdNotes=
新的SqlCommand(“从结构中选择*”,conn);
使用(SqlDataReader=cmdNotes.ExecuteReader())
{
变量序号=新
{
CodeStr=reader.GetOrdinal(“CODE_STR”),
NomStr=reader.GetOrdinal(“NOM_STR”),
};
while(reader.Read())
{
var temp=新表结构();
temp.CodeStr=reader.GetString(序号.CodeStr);
temp.NomStr=reader.GetString(序号.NomStr);
Add(temp.SqlProduct2Product());
}
}
}
退货产品;
}
公共CreateAccountViewModel()
{
_lists=新的ObservableCollection();
Lists=GetStructures();
}
XAML:

<ComboBox SelectedItem="{Binding Path=NomStr}"  ItemsSource="{Binding Lists}"></ComboBox>

如评论中所述,您希望
DisplayMemberPath
而不是
SelectedItem

DisplayMemberPath
表示“将此属性(作为路径)显示为ItemTemplate”,对于X的路径,它在功能上等同于(尽管不是代码等效):

<ComboBox>
    <ComboBox.ItemTemplate>
       <DataTemplate>
         <TextBlock Text="{Binding Path=X}"/>
       </DataTemplate>
    </ComboBox.ItemTemplate
</ComboBox>


似乎要在对话框中显示NomStr属性值。设置
DisplayMemberPath=“NomStr”
。要绑定SelectedItem(或SelectedValue),视图模型类中应该有一个适当的属性,即具有
列表
属性的te类。需要注意的是,在分配
列表
之前,不需要立即为
\u列表
分配值。我这样做了,但一开始从未工作过,但现在工作了,我想这是因为绑定键沃德,为什么在这种情况下不需要它?此外,我正在从数据库加载此代码,以便用户稍后可以插入CodeStr,在这种情况下,我是否应该将CodeStr绑定到SelectedItem?非常感谢。您在输出窗口中遇到了什么错误?正如我在评论中提到的,问题已经解决。我成功地显示了NomStr。CodeStr怎么样?我的理解是我应该将“CodeStr”绑定到SelectedItem?所以,每当NomStr改变时,CodeStr也会随之改变?(CodeStr不应对用户可见)@csharpnewie
SelectedItem
应绑定到VM上保存当前选择的属性(而不是项)。如果希望该值为该项的
CodeStr
,则使用
SelectedMemberPath
IIRC;虽然我通常只是绑定到对实际项目的引用,然后提取我需要的任何属性。是的,我意识到了!所以它是SelectedMemberPath,谢谢!