c# - WPF:将 List<class> 绑定(bind)到 ComboBox

标签 c# wpf xaml data-binding combobox

我已经在这个问题上工作了大约 3 个小时,但我走到了死胡同。 目前我正在尝试将列表绑定(bind)到 ComboBox。

我用过几种方法来绑定(bind)List:

代码隐藏:

public partial class MainWindow : Window
{
    public coImportReader ir { get; set; }

    public MainWindow()
    {          
        ir = new coImportReader();
        InitializeComponent();
    }


    private void PremadeSearchPoints(coSearchPoint sp)
    {
        //SearchRefPoint.DataContext = ir.SearchPointCollection;
        SearchRefPoint.ItemsSource = ir.SearchPointCollection;
        SearchRefPoint.DisplayMemberPath = Name;

数据已正确绑定(bind),但 DisplayMemeberPath 出于某种原因返回类的名称而不是其成员的名称。

XAML 方法返回一个空字符串...

<ComboBox x:Name="SearchRefPoint" Height="30" Width="324" Margin="0,10,0,0"
          VerticalAlignment="Top" ItemsSource="{Binding ir.SearchPointCollection}"
          DisplayMemberPath="Name">

我还尝试用我在主窗口中创建的新列表来填充它。两种情况的结果都是一样的。

我还尝试创建 ListCollectionView 并取得了成功,但问题是我可以获得 ComboBox 项目的索引。我更喜欢按 Id 工作。出于这个原因,我一直在寻找一个新的解决方案,我在以下位置找到了它:http://zamjad.wordpress.com/2012/08/15/multi-columns-combo-box/

这个例子的问题是不清楚 itemsource 是如何绑定(bind)的。

编辑:

总结一下:我目前正在尝试绑定(bind)在类 (coImportReader) 中定义的对象 (coSearchPoints) 的列表 (SearchPointsCollection)。

namespace Import_Rates_Manager
{
    public partial class MainWindow : Window
    {
        public coImportReader ir;
        public coViewerControles vc;
        public coSearchPoint sp;

        public MainWindow()
        {
            InitializeComponent();
            ir = new coImportReader();
            vc = new coViewerControles();
            sp = new coSearchPoint();
            SearchRefPoint.DataContext = ir;
        }
   }
}

//in function.... 

SearchRefPoint.ItemsSource = ir.SearchPointCollection;
SearchRefPoint.DisplayMemberPath = "Name";

namespace Import_Rates_Manager
{
    public class coImportReader
    {      
        public List<coSearchPoint> SearchPointCollection = new List<coSearchPoint>();
    }
}

namespace Import_Rates_Manager
{
    public class coSearchPoint
    {
        public coSearchPoint()
        {
            string Name = "";
            Guid Id = Guid.NewGuid();
            IRange FoundCell = null;

        }
    }
}

这会产生一个没有文本的填充组合框

最佳答案

这里是一个使用 MVVM 模式的简单示例

XAML

<Window x:Class="Binding_a_List_to_a_ComboBox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
<Grid HorizontalAlignment="Left"
      VerticalAlignment="Top">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50"/>
        <RowDefinition Height="25"/>
    </Grid.RowDefinitions>

    <ComboBox Grid.Column="0" Grid.Row="0" ItemsSource="{Binding SearchPointCollection , UpdateSourceTrigger=PropertyChanged}"
              SelectedIndex="{Binding MySelectedIndex, UpdateSourceTrigger=PropertyChanged}"
              SelectedItem="{Binding MySelectedItem, UpdateSourceTrigger=PropertyChanged}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition/>
                        <RowDefinition/>
                        <RowDefinition/>
                    </Grid.RowDefinitions>
                    <TextBlock Text="{Binding Id}" Grid.Row="0"/>
                    <TextBlock Text="{Binding Name}" Grid.Row="1"/>
                    <TextBlock Text="{Binding Otherstuff}" Grid.Row="2"/>
                </Grid>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    <Button Content="Bind NOW" Grid.Column="0" Grid.Row="1" Click="Button_Click"/>
    <TextBlock Text="{Binding MySelectedIndex, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" Grid.Row="0"/>

    <Grid  Grid.Column="1" Grid.Row="1"
           DataContext="{Binding MySelectedItem, UpdateSourceTrigger=PropertyChanged}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <TextBlock Text="{Binding Id}" Grid.Column="0"/>
        <TextBlock Text="{Binding Name}" Grid.Column="1"/>
        <TextBlock Text="{Binding SomeValue}" Grid.Column="2"/>
    </Grid>
</Grid>

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using Import_Rates_Manager;

namespace Binding_a_List_to_a_ComboBox
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DataContext = new coImportReader();
        }    
    }
}
namespace Import_Rates_Manager
{
    public class coImportReader : INotifyPropertyChanged
    {
        private List<coSearchPoint> myItemsSource;
        private int mySelectedIndex;
        private coSearchPoint mySelectedItem;

        public List<coSearchPoint> SearchPointCollection 
        {
            get { return myItemsSource; }
            set
            {
                myItemsSource = value;
                OnPropertyChanged("SearchPointCollection ");
            }
        }

        public int MySelectedIndex
        {
            get { return mySelectedIndex; }
            set
            {
                mySelectedIndex = value;
                OnPropertyChanged("MySelectedIndex");
            }
        }

        public coSearchPoint MySelectedItem
        {
            get { return mySelectedItem; }
            set { mySelectedItem = value;
            OnPropertyChanged("MySelectedItem");
            }
        }

        #region cTor

        public coImportReader()
        {
            myItemsSource = new List<coSearchPoint>();
            myItemsSource.Add(new coSearchPoint { Name = "Name1" });
            myItemsSource.Add(new coSearchPoint { Name = "Name2" });
            myItemsSource.Add(new coSearchPoint { Name = "Name3" });
            myItemsSource.Add(new coSearchPoint { Name = "Name4" });
            myItemsSource.Add(new coSearchPoint { Name = "Name5" });
        }
        #endregion

        #region INotifyPropertyChanged Member

        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #endregion
    }

    public class coSearchPoint
    {
        public Guid Id { get; set; }
        public String Name { get; set; }
        public IRange FoundCell { get; set; }    

        public coSearchPoint()
        {
            Name = "";
            Id = Guid.NewGuid();
            FoundCell = null;    
        }
    }

    public interface IRange
    {
        string SomeValue { get; }
    }
}

这里有 3 个类:

  • MainWindow 将 VM 设置为他的 Datacontext
  • coImportReader 显示您的绑定(bind)属性的类
  • coSearchPoint 这只是您信息的容器
  • IRange 这只是一个接口(interface)

关于c# - WPF:将 List<class> 绑定(bind)到 ComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633522/

相关文章:

xaml - 如何在 WinRT 中为页面导航转换设置动画?

c# - 如何在 Windows Phone 上优化带有图像的长列表选择器的性能?

c# - 位图插值

c# - 基本的c# if语句查询

C# + GL 控制混合背景与窗体

c# - 从 ICollectionView CurrentItem 的属性创建 CollectionViewSource

c# - Apose.Total 找不到许可证文件

C# 委托(delegate)给具有不同可选参数的方法

wpf - 将 RadioButton IsChecked 绑定(bind)到 ListBoxItem IsSelected 和 ListBox IsFocused

c# - 我如何在 wpf 中为组合框的选定项目编写项目模板