编写Asp.net的同学,经常会遇到一个Repeater 或者一个GridView ,当用户点击编辑状态时我们的列表组件会自动跳转到可选择(可供删除、编辑、选择等)状态。这时候一般的做法都会在组件的前方自动生成一系列复选框“CheckBox”,需要删除/选择哪行时只要在前方的复选框勾一下,便可以得到该行的数据或者行ID等。
上面的做法是一个比较典型的Web做法,那么在WP7 里面要实现这样的效果如何实现呢?有些同学就会说了,那简单使用ListBox 在它的数据模板里面添加一个CheckBox不就完事了吗?是的,这样是一种做法,但带来的问题是你得去控制他选中哪行并且得到哪行的ID,并且在WP7 有限的屏幕中这种做法比较不妥,当用户想做选择时,我们才让对应的行有可供选择的状态才更佳。而这种做法在传统的WP7控件中,是没有的。因为我们必须时时去控制它的复选框显示或者隐藏,但在这里我推荐大家一个组件,自带CheckBOx并且默认有两种状态,一种为普通状态即呈现数据显示给用户,如下图:

另外一种状态为可选择状态,即用户可以对相应的行做删除等操作,如下图:

该组件的下载地址为:WindowsPhoneListBoxWithCheckBoxesControl
下面给出该组件的详细用法:
做过.Net 开发的对于如何使该组件的应该很清楚,这里将跳过此步骤。
如上图,该组件编写的XAML代码为如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><my:ListBoxWithCheckBoxesName="listBoxWithBoxes"Margin="0,0,0,0"ItemsSource="{BindingSimpleModels}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanelOrientation="Horizontal"Margin="0,0,0,20">
<RectangleHeight="100"Width="100"Fill="#FFE5001b"Margin="12,0,9,0"/>
<StackPanel>
<TextBlockText="{BindingName}"TextWrapping="Wrap"Style="{StaticResourcePhoneTextLargeStyle}"/>
<TextBlockText="{BindingDescription}"TextWrapping="Wrap"Margin="12,-6,12,0"Style="{StaticResourcePhoneTextSubtleStyle}"/>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</my:ListBoxWithCheckBoxes>
如上代码的数据模板,并未出现有CheckBox 控件,因为该组件己经将CheckBox控件整合在里面的选择状态中了。下面是具体如何为该组件添加数据。
首先该组件对应的行有标题和描述,这个在上面XAML代码中的数据模板可以看得出,查看该组件的ItemSource ,一起来看看它的代码是如何编写的:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicclassSimpleModel:INotifyPropertyChanged
{
protectedstringitsName;
protectedstringitsDescription;
publiceventPropertyChangedEventHandlerPropertyChanged;
publicstringName
{
get{returnthis.itsName;}
set{this.itsName=value;NotifyPropertyChanged("Name");}
}
publicstringDescription
{
get{returnthis.itsDescription;}
set{this.itsDescription=value;NotifyPropertyChanged("Description");}
}
protectedvoidNotifyPropertyChanged(stringthePropertyName)
{
if(this.PropertyChanged!=null)
{
this.PropertyChanged(this,newPropertyChangedEventArgs(thePropertyName));
}
}
}
代码比较简单,封装了两个属性分别为他们注册PropertyChanged 事件响应数据变化。
而这个MODEL的数据来源于如下代码:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicclassListModel:INotifyPropertyChanged
{
publiceventPropertyChangedEventHandlerPropertyChanged;
publicObservableCollection<SimpleModel>SimpleModels{get;privateset;}
publicboolIsDataLoaded{get;privateset;}
publicListModel()
{
this.SimpleModels=newObservableCollection<SimpleModel>();
}
///<summary>
///加载数据
///</summary>
publicvoidLoadData()
{
for(inti=1;i<1000;i++)
{
this.SimpleModels.Add(newSimpleModel(){Name="第"+i+"项",Description="这是第"+i+"项数据"});
}
this.IsDataLoaded=true;
}
protectedvoidNotifyPropertyChanged(stringthePropertyName)
{
if(this.PropertyChanged!=null)
{
this.PropertyChanged(this,newPropertyChangedEventArgs(thePropertyName));
}
}
}
代码跟上边的代码差不多,这里多了调用加载数据的方法LoadData()为上面的每个Model赋值。而加载代码首先为其添加一个全局属性:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->publicstaticListBoxWithCheckBox.ViewModel.ListModelviewModel=null;
//获取数据
publicstaticViewModel.ListModelViewModel
{
get{
if(viewModel==null)
{
viewModel=newViewModel.ListModel();
}
returnviewModel;
}
}
转到MainPage的code behind 代码里面,在构造函数里面为DataContext 赋值,这里赋值的话上下文即可得到数据源,代码如下:
DataContext = App.ViewModel;
当应用程序导航进来时,调用加载全局属性去执行抓取数据的方法,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->protectedoverridevoidOnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
{
if(!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
base.OnNavigatedTo(e);
}
最后的运行效果,我们选择第1 、2条数据做为欲删除的对象,然后删除看有啥变化?

点击删除后的效果:

mainPage 的code behind 完整代码如下:

完整代码
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Net;
usingSystem.Windows;
usingSystem.Windows.Controls;
usingSystem.Windows.Documents;
usingSystem.Windows.Input;
usingSystem.Windows.Media;
usingSystem.Windows.Media.Animation;
usingSystem.Windows.Shapes;
usingMicrosoft.Phone.Controls;
usingMicrosoft.Phone.Shell;
usingListBoxWithCheckBox.ViewModel;
namespaceListBoxWithCheckBox
{
publicpartialclassMainPage:PhoneApplicationPage
{
privateApplicationBarapplicationBarChoose;
privateApplicationBarIconButtonapplicationBarIconButtonChoose;
privateApplicationBarapplicationBarDeleteOrCancel;
privateApplicationBarIconButtonapplicationBarIconButtonDelete;
privateApplicationBarIconButtonapplicationBarIconButtonCancel;
//Constructor
publicMainPage()
{
InitializeComponent();
ConstructApplicationBar();
DataContext=App.ViewModel;
this.Loaded+=newRoutedEventHandler(MainPage_Loaded);
}
voidMainPage_Loaded(objectsender,RoutedEventArgse)
{
}
protectedoverridevoidOnNavigatedTo(System.Windows.Navigation.NavigationEventArgse)
{
if(!App.ViewModel.IsDataLoaded)
{
App.ViewModel.LoadData();
}
base.OnNavigatedTo(e);
}
///<summary>
///构建应用程序条
///</summary>
privatevoidConstructApplicationBar()
{
#region--应用程序条“选择”菜单--
this.applicationBarChoose=newApplicationBar();
this.applicationBarIconButtonChoose=newApplicationBarIconButton(newUri("/content/ApplicationBar.Choose.png",UriKind.Relative));
this.applicationBarIconButtonChoose.Text="选择";
this.applicationBarIconButtonChoose.Click+=newEventHandler(applicationBarIconButtonChoose_Click);
this.applicationBarChoose.Buttons.Add(this.applicationBarIconButtonChoose);
this.applicationBarChoose.IsMenuEnabled=true;
this.applicationBarChoose.IsVisible=true;
this.ApplicationBar=this.applicationBarChoose;
#endregion
this.applicationBarDeleteOrCancel=newApplicationBar();
#region--删除--
this.applicationBarIconButtonDelete=newApplicationBarIconButton(newUri("/content/ApplicationBar.Delete.png",UriKind.Relative));
this.applicationBarIconButtonDelete.Text="删除";
this.applicationBarIconButtonDelete.Click+=newEventHandler(applicationBarIconButtonDelete_Click);
#endregion
#region--取消--
this.applicationBarIconButtonCancel=newApplicationBarIconButton(newUri("/content/ApplicationBar.Cancel.png",UriKind.Relative));
this.applicationBarIconButtonCancel.Text="取消";
this.applicationBarIconButtonCancel.Click+=newEventHandler(applicationBarIconButtonCancel_Click);
#endregion
this.applicationBarDeleteOrCancel.Buttons.Add(this.applicationBarIconButtonDelete);
this.applicationBarDeleteOrCancel.Buttons.Add(this.applicationBarIconButtonCancel);
this.applicationBarDeleteOrCancel.IsMenuEnabled=true;
this.applicationBarDeleteOrCancel.IsVisible=true;
}
///<summary>
///listBox为可选择状态
///</summary>
privatevoidSwitchToChooseState()
{
this.listBoxWithBoxes.IsInChooseState=true;
this.ApplicationBar=this.applicationBarDeleteOrCancel;
}
///<summary>
///listBox为普通状态
///</summary>
privatevoidSwitchToNormalState()
{
this.listBoxWithBoxes.IsInChooseState=false;
this.ApplicationBar=this.applicationBarChoose;
}
///<summary>
///取消操作
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
voidapplicationBarIconButtonCancel_Click(objectsender,EventArgse)
{
SwitchToNormalState();
}
///<summary>
///删除操作
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
voidapplicationBarIconButtonDelete_Click(objectsender,EventArgse)
{
if(MessageBox.Show("你确定要删除选中项吗?","提示",MessageBoxButton.OKCancel)==MessageBoxResult.OK)
{
foreach(SimpleModeliteminthis.listBoxWithBoxes.SelectedItems)
{
App.ViewModel.SimpleModels.Remove(item);
}
SwitchToNormalState();
}
}
///<summary>
///选择操作
///</summary>
///<paramname="sender"></param>
///<paramname="e"></param>
voidapplicationBarIconButtonChoose_Click(objectsender,EventArgse)
{
SwitchToChooseState();
}
}
}
这里推荐一个小技巧,当我们编写动态数据时,又不想运行即想从代码IDE看到运行效果,类似于这样:

这个效果还是要借用PhoneApplicationPage 的DataContext属性,具体如下编写代码:
- 编写一个数据xaml命名为:ViewModelSampleData.xaml 文件,该文件负责为SimpleModels 做数据,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><viewModels:ListModel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModels="clr-namespace:ListBoxWithCheckBox.ViewModel">
<viewModels:ListModel.SimpleModels>
<viewModels:SimpleModelName="测试第一项"Description="这是测试的第一个节点"/>
<viewModels:SimpleModelName="测试第二项"Description="这是测试的第二个节点"/>
</viewModels:ListModel.SimpleModels>
</viewModels:ListModel>
- 在MainPage文件的XAML界面为DataContext赋值,代码如下:
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->d:DataContext="{d:DesignDataViewModelSampleData.xaml}"
Tip:该效果只运用于没有运行即可查看效果,运行后将会忽略。
怎么样,该组件不错吧,大家下载后试试吧。
源码下载:
ListBoxWithCheckBox Demo
分享到:
相关推荐
"WP7 ListBox 下拉刷新组件"就是为了解决这个问题而设计的一个自定义控件,它允许用户在顶部拉动ListBox时触发数据的刷新操作。这个组件对于那些需要实时显示更新内容的应用程序来说非常有用,例如新闻阅读器或者...
本项目“wp7使用本地数据库——记分牌”就是这样一个实例,它利用了WP7内置的SQLite数据库来实现一个记分牌功能。SQLite是一个轻量级的关系型数据库,适合在移动设备上进行本地数据存储。 首先,我们需要了解如何在...
1. **点击编辑**:当用户单击ListBox中的某一项时,该控件可能会自动进入编辑模式,将选中的文本变为可编辑状态。这可能通过响应鼠标点击事件并切换文本框的可见性和禁用状态来实现。 2. **添加新项**:控件可能还...
在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)环境中实现拖放效果,特别是如何将一个ListBox中的数据项拖动到另一个ListBox中。WPF是.NET Framework的一部分,提供了丰富的用户界面功能,...
在这个场景中,"js listbox多选组件"是指使用JavaScript实现的一个Listbox(列表框)控件,该控件允许用户进行多项选择,类似于我们在网页上常见的复选框或下拉列表。在Web开发中,这样的组件通常用于提高用户界面的...
在Delphi中,ListBox是一个常用的UI组件,它允许用户从一个下拉列表中选择一个或多个项目。ListBox可以通过多种方式添加项目,例如在设计时直接添加或者运行时动态添加。 #### 1.2 ListBox 的主要属性 - **Items**:...
总的来说,通过定制`DataTemplate`、样式和模板,以及巧妙地利用虚拟化和事件处理,我们可以将WPF的`ListBox`打造成一个既美观又实用的组件。无论是简单的文本列表还是复杂的布局,`ListBox`都能满足你的需求,为...
在某些交互设计中,允许用户通过拖放操作将Listbox中的条目从一个列表移动到另一个列表是提高用户体验的有效方式。本篇文章将详细探讨如何在C#环境下实现这一功能。 首先,我们需要创建两个Listbox控件,分别命名为...
这个“一个Delphi新手写的ListBox左右交换内容例子”是一个学习资源,旨在帮助初学者理解如何在Delphi中操作控件,特别是ListBox,进行数据交换。 ListBox是Windows应用程序中常见的控件,它允许用户从列表中选择一...
本教程主要聚焦于MATLAB GUI中的一个重要组件——ListBox,它允许用户从预设的选项列表中选择一个或多个项。在“MATLAB GUI教学视频7:ListBox的基本用法”中,我们将深入探讨ListBox的创建、配置和事件处理,以及...
在实际应用中,我们经常需要将一个Listbox中的数据移动到另一个Listbox,这通常涉及到选中项的转移或者整个Listbox内容的清空与复制。本篇文章将详细讲解如何实现"两个listbox之间内容转移",包括选中项的转移和全部...
在Python的图形用户界面编程中,Tkinter库是标准的GUI工具...而Listbox组件则为用户提供了一个可视化的多选项列表,适用于数据展示和选择操作。通过熟练掌握这些组件的使用,可以构建出功能丰富的Python桌面应用程序。
CheckListBox是一个常用的选择列表控件,它通常显示一个项目列表,每个项目前有一个复选框。然而,默认情况下,CheckListBox可能无法完整显示较长的文本内容,导致用户无法清晰看到所有信息。为了解决这个问题,我们...
在许多编程环境中,Listbox是一个常用的组件,用于显示可选择的项目列表。"完美版"可能意味着这个Listbox实现了更多的功能,或者在性能、用户体验、样式美化等方面有显著提升。 【描述】"TXJDBGridEh:美化版的...
在C# WinForm开发中,`ListBox`控件是一个常用组件,用于展示一系列可选的项。本示例探讨的是如何实现`ListBox`控件中每一行文本的颜色自定义,即“c# 一个listbox的行字体颜色应用”。这个技巧能够帮助开发者提升...
以下是一个简单的步骤,演示了如何将文本文件内容加载到`ListBox`: 1. **创建StreamReader对象**:首先,我们需要创建一个`StreamReader`对象,传入要读取的文件路径和编码方式。在示例代码中,使用了`Encoding....
在这个示例中,我们将实现两个ListBox控件之间的拖拽操作,用户可以将一个ListBox控件中的项目拖到另一个ListBox控件中,反之亦然。在拖拽过程中,鼠标会呈现手势状,以增强拖动操作的形象化。 要实现ListBox控件的...
在C# WinForm开发中,`ListBox`控件是一个常用组件,用于展示一系列可选项目。本主题将深入探讨如何实现“C# winform ListBox点击切换图片”的功能,即当用户在ListBox中选择不同的项时,显示相应的图片。这个功能在...
在C#编程中,Listbox控件是一种常用的数据展示组件,它允许程序员向用户显示一系列条目或选项。当我们处理大量数据或者实时更新内容时,可能会遇到需要实现Listbox自动滚动的功能。这个功能通常用于确保最新的添加项...
在Windows编程中,ListBox控件是一种常见的用户界面元素,它允许用户从一组选项中选择一个或多个项目。在各种应用程序中,我们可能需要在两个ListBox之间交换数据,以实现更复杂的用户交互。这个主题主要涉及如何在...