c#wpf 中有没有checklistbox
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#wpf 中有没有checklistbox相关的知识,希望对你有一定的参考价值。
参考技术A 实际项目中常常要实现有CheckBox列表框。但是WPF没有自带这样的一个控件,下面就用Style来实现这样的功能。而对于CheckBox列表框,又常常会有一个Select All的CheckBox来表示当前列表框的选择状态。这个功能也会被包含在下面的示例之中。效果如下图所示。对于单纯的,没有后台数据绑定的情况下,这个功能可以用ItemContainerStyle来实现。代码如下:
复制代码
CheckListBoxItemContainerStyle
<Style x:Key="CheckListBoxItemContainerStyle"
TargetType="x:Type ListBoxItem">
<!--Set it un-focusable, becaues the CheckBox in it should be focusable and only it.-->
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type ListBoxItem">
<CheckBox Content="TemplateBinding Content"
ContentTemplate="TemplateBinding ContentTemplate"
ContentTemplateSelector="TemplateBinding ContentTemplateSelector"
IsChecked="Binding IsSelected, RelativeSource=RelativeSource TemplatedParent"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
复制代码
其中要对Content和ContentTemplate等属性进行绑定,以方便对其进行扩展,保证其通用性。这个Style一般会放在Application级别的Resource中。
对于有后台数据绑定的情况,一般会有双个属性要绑定,一个是CheckBox里的Content,一个是CheckBox的IsChecked。绑定的路径,只有在用一个Style的ListBox那里才知道,所以并不能写在这个Style里,否则会破坏这个Style的通用性。比较合理的方式是基于这个现有的Style进行修改。
对于下面的数据类。
DataItem Class
我们需要下面这个有针对性的Style来应用数据绑定。
复制代码
DataItemCheckListBoxStyle
<Style x:Key="DataItemCheckListBoxStyle"
TargetType="x:Type ListBox"
BasedOn="StaticResource x:Type ListBox">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="Binding Name"/>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="x:Type ListBoxItem"
BasedOn="StaticResource CheckListBoxItemContainerStyle">
<Setter Property="IsSelected"
Value="Binding IsEnabled"/>
<Setter Property="Margin" Value="2,2,0,0"/>
</Style>
</Setter.Value>
</Setter>
<Setter Property="SelectionMode" Value="Multiple"/>
</Style>
复制代码
在上面的Style中,使用了ItemTemplate来指定CheckBox里的Content绑定到的属性,并把ListBoxItem的IsSelected绑定数据的相应属性上。由于这个Style是针对特定数据写的,所以应当放置在使用这个Style的ListBox所在的Window的Resource中。
当然,也可以为ListBox添加两个绑定类型的Attached Property来实现一个通用的Style。不过这个Property一样要在使用的地方设置,其实没有太大区别。有兴趣的读者可以自己试一下。
对于Select All这个CheckBox而言,用Attached Property倒是很方便。给CheckBox添加一个SyncTarget属性指向要同步的ListBox,就可以在Window.xaml.cs之外的地方同步CheckBox和ListBox了。代码如下:
ToggleButtonProperty
使用方式也很简单。如下代码所示。
复制代码
用法
<DockPanel Margin="12">
<CheckBox Content="Select All"
Margin="0,0,0,5"
DockPanel.Dock="Top"
ext:ToggleButtonProperty.SyncTarget="Binding ElementName=checkListBox"/>
<ListBox x:Name="checkListBox"
Style="StaticResource DataItemCheckListBoxStyle"
ItemsSource="Binding Path=Items, ElementName=mainWindow"/>
</DockPanel>
搜索checklistbox的文本框,但不记得检查的项目C#C调
当我检查了checkedListBox1对列表中的项目和使用textBox1的我以前的检查搜索的一些项目已经一去不复返了。当我搜索使用textBox1的并检查列表中的一些项目,寻找另一个项目之前的检查中也没了。任何解决方案? C#
void ladujZBazy(string mustContains)
checkedListBox1.Items.Clear();
listSurowceTabela.Clear();
indexes.Clear();
bazaproduktowDBEntities dc = new bazaproduktowDBEntities();
var c1 = from d in dc.SurowceTabela select d.NazwaSurowca;
var c2 = from d in dc.SurowceTabela select "(" + d.PartiaSurowca + ")";
var c3 = from d in dc.SurowceTabela select d.IloscSurowca;
var c4 = from d in dc.SurowceTabela select d.JednostkaSurowca;
listSurowceTabela.Add(c1.ToList());
listSurowceTabela.Add(c2.ToList());
listSurowceTabela.Add(c3.ToList());
listSurowceTabela.Add(c4.ToList());
for (int i = 0; i < listSurowceTabela[0].Count; i++)
string strToAdd = "";
for (int j = 0; j < listSurowceTabela.Count; j++)
strToAdd += " " + listSurowceTabela[j][i] + " ";
if (mustContains == null)
checkedListBox1.Items.Add(strToAdd);
indexes.Add(i);
else if (strToAdd.ToLower().Contains(mustContains.ToLower()))
checkedListBox1.Items.Add(strToAdd);
indexes.Add(i);
private void textBox1_TextChanged(object sender, EventArgs e)
ladujZBazy(textBox1.Text);
答案
注释掉在代码的顶部的清除()方法。这应该表明你正在清除这些值。然后通过实际需要的东西要清除,什么没有你的工作方式。
另一答案
那么,你的问题主要在于在ladujZBazy()
这几行:
checkedListBox1.Items.Clear();
indexes.Clear();
你在哪里打电话来清除checkedListBox1
的所有内容和它的存储索引。
因此,每次调用你的函数做,你是从checkedListBox1
清理所有内容,然后重新创建/附加内容,回去吧。因此,它只是刷新所有项目在checkedListBox1
(即删除列表中的任何已检查的项目)。
因此,我们有2种方式,使我们可以使它发挥作用。
- 我们可以在
Boolean
参数添加到这将决定是否清除ladujZBazy()
或不checkedListBox1
。
而修改后的ladujZBazy()
随后将是这个样子:
void ladujZBazy(string mustContains, bool dropIndexes)
// the below code will only run the value is supplied as TRUE
if(dropIndexes)
checkedListBox1.Items.Clear();
listSurowceTabela.Clear();
indexes.Clear();
// your rest of the code goes here
然后从文本框的TextChanged
事件作为称呼它:
ladujZBazy(textBox1.Text,false);// pass TRUE to clear the checked items
- 或者,我们可以移动索引和检查项目结算及CheckListBox刷新逻辑到一个单独的函数为:
private void refreshChkListBox() checkedListBox1.Items.Clear(); listSurowceTabela.Clear(); indexes.Clear(); //your code to append items to list goes here
后来又调用这个函数来刷新CheckListBox
如果你有一个需要它。
以上是关于c#wpf 中有没有checklistbox的主要内容,如果未能解决你的问题,请参考以下文章