将ListView项目绑定到可编辑的组合框所选值

时间:2018-11-20 09:15:25

标签: c# listview combobox

我有一个ListView和一个ComboBox。他们两个都绑定到填充了数据库项目的同一List。

  1. 我希望ListView项目反映ComboBox中的选定项目(即,当用户选择“ Name0”时,我希望Listview仅显示Name0行)。如果我从下拉列表中选择项目,它会起作用,但是当我在组合框中键入文本(可编辑)时,如果文本与组合项目内容不匹配(例如,如果我键入“ Name01”或如果我使用反斜杠删除文本)。我尝试将搜索字符串更改为ComboBox的Text属性,但是通过这种方式,仅在第二次选择项目时更新列表(如果我选择“ Name0”,则什么也没有发生;如果我选择“ Name1”,则列表将不显示“ Name0”行)。

  2. 此外,我还想在组合中的文本中搜索子字符串(即,如果我键入“ 4”,我希望列表视图显示“ Name4”行),但它仅从第一个字母搜索文本为了做到这一点,我尝试使用Table.Select而不是String。包含但没有任何变化。 任何帮助都非常感谢。 希望我的问题很清楚(我是一名业余程序员)。

这是我的代码:

namespace LVCombo
{
    public partial class MainWindow : Window
    {
        DataSet MyDataSet = new DataSet();
        public static List<Persons> MyList = new List<Persons>();
        public MainWindow()
        {
            InitializeComponent();
            DataTable MyDataTable = MyDataSet.Tables.Add("MyDataTable");
            MyDataTable.Columns.Add("Name", typeof(string));
            MyDataTable.Columns.Add("Age", typeof(int));
            AddData(MyDataTable);
            CreateList();
            MyListView.ItemsSource = MyList;
            MyCombo.ItemsSource = MyList;
        }`

        private void AddData(DataTable table)
        {
            for (int i = 0; i < 10; i++)
            {
                DataRow row = table.NewRow();
                row["Name"] = "Name" + i.ToString();
                row["Age"] = "4" + i.ToString();
                table.Rows.Add(row);
            }
        }

        public class Persons
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        private void CreateList()
        {
            foreach(DataRow row in MyDataSet.Tables[0].Rows)
            {
                MyList.Add(new Persons() { Name=row["Name"].ToString(), Age= (int)row["Age"]});
            }
        }

        private void MyCombo_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox combo = sender as ComboBox;
            List<Persons> SelectedPersons = new List<Persons>();
            MyListView.ItemsSource = SelectedPersons;
          //  string person = combo.SelectedValue.ToString().ToLower();
               string person = combo.Text.ToLower();

            //Table.Select version
            DataRow[] FilteredRows = MyDataSet.Tables[0].Select(string.Format("{0} LIKE '%{1}%'", MyDataSet.Tables[0].Columns["Name"], person));
            for(int i = 0; i < FilteredRows.Length; i++)
            {
                SelectedPersons.Add(new Persons()
                {
                    Name = FilteredRows[i]["Name"].ToString(),
                    Age = (int)FilteredRows[i]["Age"]
                });
                MyListView.ItemsSource = SelectedPersons;
            }


            //String.Contains version

         /*   foreach (DataRow row in MyDataSet.Tables[0].Rows)
            {
                if (row["Name"].ToString().ToLower().Contains(person))
                {
                    SelectedPersons.Add(new Persons() { Name = row["Name"].ToString(), Age = (int)row["Age"] });
                }
            MyListView.ItemsSource = SelectedPersons;*/

        }
    }
}

和我的XAML:

<Window x:Class="LVCombo.MainWindow"
    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"
    xmlns:local="clr-namespace:LVCombo"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
        <ListView Name="MyListView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding Name}" Margin="10"/>
                        <TextBlock Text="{Binding Age}" Margin="10"/>
                    </StackPanel>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <ComboBox Name="MyCombo" DisplayMemberPath="Name" SelectedValuePath="Name" IsEditable="True" 
                  Height="22" Width="100" VerticalAlignment="Top" SelectionChanged="MyCombo_SelectionChanged"/>
    </StackPanel>
</Grid>

1 个答案:

答案 0 :(得分:0)

我弄清楚自己,我正在发布答案,以防万一其他人遇到相同的问题。 我应该使用TextBoxBase.TextChanged事件代替Combobox.SelectionChanged事件。这样做可以解决这两个问题。

<ComboBox Name="MyCombo" IsEditable="True" TextBoxBase.TextChanged="MyCombo_TextChanged"