У меня есть ListView и ComboBox.Оба они привязываются к одному и тому же списку, заполненному элементами базы данных.
Я хочу, чтобы элементы ListView отражали выбранные элементы в комбинированном списке (т. Е. Когда пользователь выбирает «Name0», я хочу просмотр спискаотображать только строку Name0).Это работает, если я выбираю элементы из выпадающего списка, но когда я набираю текст в поле со списком (будучи редактируемым), возникает нулевое исключение, если текст не соответствует содержимому комбинированных элементов (т.е. если я набираю «Name01» илиесли я удалю текст, используя обратную косую черту).Я попытался изменить строку поиска на свойство Text в ComboBox, но таким образом список обновляется только во второй раз, когда я выбираю элемент (если я выберу «Name0», ничего не произойдет, если я затем выберу «Name1», список исчезает)Name0 "вместо строки).
Кроме того, я хотел бы искать текст в комбо-файле также для поиска подстрок (т.е. если я наберу «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>