我有一个ListView和一个ComboBox。他们两个都绑定到填充了数据库项目的同一List。
我希望ListView项目反映ComboBox中的选定项目(即,当用户选择“ Name0”时,我希望Listview仅显示Name0行)。如果我从下拉列表中选择项目,它会起作用,但是当我在组合框中键入文本(可编辑)时,如果文本与组合项目内容不匹配(例如,如果我键入“ Name01”或如果我使用反斜杠删除文本)。我尝试将搜索字符串更改为ComboBox的Text属性,但是通过这种方式,仅在第二次选择项目时更新列表(如果我选择“ Name0”,则什么也没有发生;如果我选择“ Name1”,则列表将不显示“ Name0”行)。
此外,我还想在组合中的文本中搜索子字符串(即,如果我键入“ 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>
答案 0 :(得分:0)
我弄清楚自己,我正在发布答案,以防万一其他人遇到相同的问题。 我应该使用TextBoxBase.TextChanged事件代替Combobox.SelectionChanged事件。这样做可以解决这两个问题。
<ComboBox Name="MyCombo" IsEditable="True" TextBoxBase.TextChanged="MyCombo_TextChanged"