WPF:如何将对象绑定到 ComboBox

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19071664/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 23:57:29  来源:igfitidea点击:

WPF: How to bind object to ComboBox

wpfxamlobjectdata-bindingcombobox

提问by Unrepentent Geek

Trying to learn how to bind objects to various types of controls. In this instance, I want to get sample data in my object to appear in ComboBox. The code runs but what appears instead of values (David, Helen, Joe) is text "TheProtect.UserControls.Client")

尝试学习如何将对象绑定到各种类型的控件。在这种情况下,我想在我的对象中获取示例数据以显示在 ComboBox 中。代码运行,但出现的不是值(David、Helen、Joe)是文本“TheProtect.UserControls.Client”)

XAML: (ucDataBindingObject.xaml)

XAML: (ucDataBindingObject.xaml)

<UserControl x:Class="TheProject.UserControls.ucDataBindingObject"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             Width="Auto"
             Height="Auto"
             mc:Ignorable="d">

    <Grid Width="130"
          Height="240"
          Margin="0">

            <ComboBox Width="310"
                      HorizontalAlignment="Left"
                      VerticalAlignment="Top"
                      ItemsSource="{Binding Path=Clients}" />
    </Grid>
</UserControl>

C#: ucDataBindingObject.xaml.cs

C#:ucDataBindingObject.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Controls;
namespace TheProject.UserControls
{
    public partial class ucDataBindingObject : UserControl
    {

        public List<Client> Clients { get; set; }


        public ucDataBindingObject()
        {
            Clients = new List<Client>();
            Clients.Add(new Client(1, "David")); // sample data
            Clients.Add(new Client(2, "Helen"));
            Clients.Add(new Client(3, "Joe"));


            InitializeComponent();
            this.DataContext = this;
        }
    }

C# Client.cs

C# 客户端.cs

using System;
using System.Linq;

namespace TheProject.UserControls
{
    public class Client
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public Client(int id, string name)
        {
            this.ID = id;
            this.Name = name;
        }
    }
}

回答by McGarnagle

There are several ways to tell the framework what to display

有几种方法可以告诉框架要显示什么

1) Use DisplayMemberPathon the ComboBox (this will display the named property):

1)DisplayMemberPath在 ComboBox 上使用(这将显示命名属性):

<ComboBox ItemsSource="{Binding Path=Clients}" 
          DisplayMemberPath="Name"
/>

2) Set ItemTemplateon the ComboBox. This is like #1, except allows you to define a template to display, rather than just a property:

2)ItemTemplate在 ComboBox 上设置。这就像#1,除了允许您定义要显示的模板,而不仅仅是一个属性:

<ComboBox ItemsSource="{Binding Path=Clients}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Border BorderBrush="Green" BorderThickness="1" Padding="5">
                <TextBlock Text="{Binding Path=Name,StringFormat='Name: {0}'}" />
            </Border>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

3) Add a ToString()override to source class. Useful if you always want to display the same string for a given class. (Note that the default ToString()is just the class type name, which is why you see "TheProtect.UserControls.Client".)

3)ToString()向源类添加覆盖。如果您总是想为给定的类显示相同的字符串,则很有用。(请注意,默认ToString()值只是类类型名称,这就是您看到“TheProtect.UserControls.Client”的原因。)

public class Client
{
    // ...

    public override string ToString()
    {
        return string.Format("{0} ({1})", Name, ID);
    }
}

4) Add a DataTemplateto the XAML resources. This is useful for associating a given class type with a more complex or stylized template.

4)DataTemplate向 XAML 资源添加一个。这对于将给定的类类型与更复杂或风格化的模板相关联很有用。

<UserControl xmlns:local="clr-namespace:TheProject.UserControls">
    <UserControl.Resources>
        <DataTemplate DataType="local:Client">
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </UserControl.Resources>

    // ...

</UserControl>    

回答by Paranjay Srivastava

In DisplayMemberPath, give the name of the property which you want to show in the comboBox. In SelectedValuePath, give the name of the property which you want to select. When you do a ComboBox.SelectedValue, you will get the value of this property.

在 中DisplayMemberPath,给出要在组合框中显示的属性的名称。在 中SelectedValuePath,给出要选择的属性的名称。当您执行 a 时ComboBox.SelectedValue,您将获得此属性的值。

回答by Pan Markosian

Trying to get selected value from combobox returns System.Data.Entity.DynamicProxies.x

尝试从组合框中获取选定的值返回 System.Data.Entity.DynamicProxies.x

 private void Button_Click(object sender, RoutedEventArgs e){
         string _scanner0 = int.Parse(mycmb.SelectedValue.ToString());
         string _scanner1 = mycbr.SelectedItem.ToString();
         string _scanner2 = mycbr.SelectedValuePath.ToString();
         string _scanner3 = mycbr.text.ToString();
     }

all these Returns System.Data.Entity.DynamicProxies.x What should i do?

所有这些返回 System.Data.Entity.DynamicProxies.x 我该怎么办?