Привязать элементы ListView к редактируемому выбранному значению Combobox - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть ListView и ComboBox.Оба они привязываются к одному и тому же списку, заполненному элементами базы данных.

  1. Я хочу, чтобы элементы ListView отражали выбранные элементы в комбинированном списке (т. Е. Когда пользователь выбирает «Name0», я хочу просмотр спискаотображать только строку Name0).Это работает, если я выбираю элементы из выпадающего списка, но когда я набираю текст в поле со списком (будучи редактируемым), возникает нулевое исключение, если текст не соответствует содержимому комбинированных элементов (т.е. если я набираю «Name01» илиесли я удалю текст, используя обратную косую черту).Я попытался изменить строку поиска на свойство Text в ComboBox, но таким образом список обновляется только во второй раз, когда я выбираю элемент (если я выберу «Name0», ничего не произойдет, если я затем выберу «Name1», список исчезает)Name0 "вместо строки).

  2. Кроме того, я хотел бы искать текст в комбо-файле также для поиска подстрок (т.е. если я наберу «4», я бы хотел, чтобы в списке отображалась строка «Name4»), но это толькоищет текст по первой букве слова. Для этого я попытался использовать Table.Select вместо String.Contains, но ничего не изменилось.Любая помощь очень ценится.Надеюсь, мой вопрос достаточно ясен (я программист-любитель).

Вот мой код:

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 голосов
/ 21 ноября 2018

Я сам разобрался, выкладываю ответ на тот случай, если кто-то еще столкнется с такой же проблемой. Я должен был использовать событие TextBoxBase.TextChanged вместо Combobox.SelectionChanged. Это решает обе проблемы.

<ComboBox Name="MyCombo" IsEditable="True" TextBoxBase.TextChanged="MyCombo_TextChanged"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...