当前位置:网站首页>WPF如何自定义隐藏下拉框选项
WPF如何自定义隐藏下拉框选项
2022-08-01 14:10:00 【InfoQ】
<ComboBox IsTextSearchEnabled="False"
IsEditable="True"
ItemsSource="source" <!--source {value:string, text:string }-->
KeyUp="comboBox_KeyUp" DropDownOpened="OnDropDownOpened" DropDownClosed="OnDropDownClosed"
/>
/// <summary>
/// 搜索条件过滤
/// </summary>
private void comboBox_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
var combobox = (ComboBox)sender;
combobox.SelectedItem = null;
var ctb = combobox.Template.FindName("PART_EditableTextBox", combobox) as TextBox;
if (ctb == null) return;
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift) || Keyboard.Modifiers.HasFlag(ModifierKeys.Control) || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
return;
var caretPos = ctb.CaretIndex;
combobox.IsDropDownOpen = true;
var datasource = (combobox.ItemsSource as List<SelectOption>).DeepClone().Where(x => /*自定义条件*/)).ToList();
combobox.ItemsSource = datasource;
CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(combobox.Items);
itemsViewOriginal.Filter = ((o) =>
{
if (String.IsNullOrEmpty(combobox.Text))
{
return true;
}
else
{
if (((SelectOption)o).text.ToLower().Contains(combobox.Text.ToLower()))//(SelectOption)o).text.StartsWith(combobox.Text, true, null)
{
return true;
}
else
{
return false;
}
}
});
itemsViewOriginal.Refresh();
ctb.CaretIndex = caretPos;
}
/// <summary>
/// 下拉框初始化过滤
/// </summary>
private void OnDropDownOpened(object sender, EventArgs e)
{
var cb = (ComboBox)sender;
if (cb.IsDropDownOpen == true)
{
var combobox = (ComboBox)sender;
//combobox.SelectedItem = null;
var ctb = combobox.Template.FindName("PART_EditableTextBox", combobox) as TextBox;
if (ctb == null) return;
if (Keyboard.Modifiers.HasFlag(ModifierKeys.Shift) || Keyboard.Modifiers.HasFlag(ModifierKeys.Control) || Keyboard.Modifiers.HasFlag(ModifierKeys.Alt))
return;
var caretPos = ctb.CaretIndex;
combobox.IsDropDownOpen = true;
var tempValue = combobox.SelectedValue;
var datasource = (combobox.ItemsSource as List<SelectOption>).DeepClone()
.Where(x => /*自定义条件*/)
.ToList();
combobox.ItemsSource = datasource;
CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(combobox.Items);
itemsViewOriginal.Refresh();
combobox.SelectedValue = tempValue;
ctb.CaretIndex = caretPos;
}
}
/// <summary>
/// 下拉框数据源还原
/// </summary>
private void OnDropDownClosed(object sender, EventArgs e)
{
var cb = (ComboBox)sender;
if (cb.IsDropDownOpen == false)
{
var tempValue = cb.SelectedValue;
cb.ItemsSource = (this.DataContext as /*定义的前端ViewModel*/).source;
cb.SelectedValue = tempValue;
}
}
结语
边栏推荐
猜你喜欢

「计算复杂性」理论奠基人Juris Hartmanis逝世,曾获93年图灵奖

Gradle series - Gradle tests, Gradle life cycle, settings.gradle description, Gradle tasks (based on Groovy documentation 4.0.4) day2-3

长江欧拉生态创新中心成立,武汉数字经济再添坚实底座

HTB-Shocker

HTB-Mirai

龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权

【2022蓝帽杯】file_session && 浅入opcode

OpenSSL SSL_read: Connection was reset, errno 10054

MCU开发是什么?国内MCU产业现状如何

Yann LeCun开怼谷歌研究:目标传播早就有了,你们创新在哪里?
随机推荐
【每日一题】1161. 最大层内元素和
ABC260 E - At Least One(双指针)
微服务原生案例搭建
AD单片机九齐单片机NY8B062D SOP16九齐
Qt实战案例(55)——利用QDir删除选定文件目录下的空文件夹
【每日一题】592. 分数加减运算
1161. 最大层内元素和
「计算复杂性」理论奠基人Juris Hartmanis逝世,曾获93年图灵奖
win10+Qt5.15.2实现低功耗蓝牙控制
如何降低Istio服务网格中Envoy的内存开销
PIR人体感应AC系列感应器投光灯人体感应开关等应用定制方案
ThreadLocal保存用户登录信息
AtCoder Beginner Contest 261 D - Flipping and Bonus
大佬们,datax同步数据,同步过程中要新增一个uuid,请问column 怎么写pgsql,uu
Two Permutations
DDL和DML的含义与区别「建议收藏」
又拿三个大奖?!多力就是要让你吃的更营养更健康
NFV迈向云原生时代:Network Service Mesh项目介绍
170页6万字智慧能源管理平台建设方案书
PAT1165 Block Reversing(25)