闲话WinFrom与WPF(3) 控件篇——CheckedListBox
我曾经写过一个筛选的Demo,里面有一个列表选择控件:

这次只是说一个全选功能。
我曾经以为应该有更优雅的方式去实现全选功能,即使到现在我还是没有找到,有时候人们会告诉你不要对一个问题过于纠结,只要实现了功能就成,但是程序员往往不是这么想。
当我开始再一次用WinForm实现这个功能时,发现还是只能使用原来的方法,没有更好的方案去做这个。这要说还是由于WinForm过于死板,无法如WPF一般简单的实现自定义。
鉴于此Demo为本系列文章的第一篇WPF的Demo,这里尽量说的自己感觉易懂,仅仅展示重写模板的一些问题。
原文地址:http://nanqi.info/blog/2013/03/31/winform-wpf-3/
WinForm中的实现方案
代码几乎与那个筛选的Demo没有改变多少,唯一不同的是我发现其实不必自己去控制CheckedBox的选择(AutoCheck),同时也发现其实自己当时做的也没有错,因为如果当CheckedBox的CheckState属性为indeterminate时,想让再点一次让其选中,那么还必须我这么做(其实也从侧面反应,自己不止实现多余,而且做错了)。
我依旧使用CheckedListBox的ItemCheck事件,代码如下:
private void checkListBox_SelectionChanged(object sender, SelectionChangedEventArgs e){ chbxAll.IsChecked = checkListBox.SelectedItems.Count == 0 ? false : checkListBox.SelectedItems.Count == checkListBox.Items.Count ? (bool?)true : null;}private void chbxAll_Checked(object sender, RoutedEventArgs e){ checkListBox.SelectAll();}private void chbxAll_Unchecked(object sender, RoutedEventArgs e){ checkListBox.UnselectAll();}你会发现,似乎很简单,比WinForm中还要简单。
但是你可知道,WPF如果要做到真正的页面与逻辑分离,后台是没有任何逻辑代码的,要有,也仅仅是一些控制界面的显示的代码。
当然,我们不需要把一件事情做的太彻底,而且强求不在后台写代码也不是一种正确的开发方式,而例子写在这里,也仅仅只想表达一个意思,那就是在WPF中一个功能的实现方式太多,希望大家不要因为实现了而不再去探索更好的实现方式,有时候这也是对于WPF设计方面的一次学习。
源码地址:https://github.com/NanQi/demo/tree/master/SelectDemo