我有一个 ListView 和一个 ComboBox。它们都绑定到填充了数据库项的同一个 List。
我希望 ListView 项目反映 ComboBox 中的选定项目(即,当用户选择“Name0”时,我希望列表视图仅显示 Name0 行)。如果我从下拉列表中选择项目,它会起作用,但是当我在组合框中键入文本(可编辑)时,如果文本与组合项目内容不匹配(即,如果我键入“Name01”或如果我使用反斜杠删除文本)。我试图将搜索字符串更改为 ComboBox 的 Text 属性,但这样列表仅在我第二次选择该项目时更新(如果我选择“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>
我想通了,我发布了一个答案,以防万一其他人遇到同样的问题。我应该使用 TextBoxBase.TextChanged 事件而不是 Combobox.SelectionChanged 事件。这样做可以解决这两个问题。
<ComboBox Name="MyCombo" IsEditable="True" TextBoxBase.TextChanged="MyCombo_TextChanged"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句