Silverlight CheckBoxList

项目要用到复选框,但是在Silverlight中不存在CheckBoxList,通过查阅资料以及根据自己的理解,写了简单示例:

1.XAML

<UserControl x:Class="SilverlightApplication1.CheckboxList"xmlns=""xmlns:x=""xmlns:d=""xmlns:mc=""xmlns:local="clr-namespace:SilverlightApplication1"xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="400"><Grid x:Name="LayoutRoot" Background="White"><ListBox x:Name="lst"><ListBox.ItemsPanel><ItemsPanelTemplate><controlsToolkit:WrapPanel Orientation="Vertical" Height="30" /></ItemsPanelTemplate></ListBox.ItemsPanel></ListBox></Grid></UserControl>

其中这里要引用Silverlight 3 Toolkit中的WrapPanel面板

xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"2.CSnamespace SilverlightApplication1{public partial class CheckboxList : UserControl{#region 属性注册public static readonly DependencyProperty ItemsSourceProperty =DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckboxList), new PropertyMetadata(null, ItemsSourceChanged));public static readonly DependencyProperty SelectedItemsProperty =DependencyProperty.Register("SelectedItems", typeof(IEnumerable), typeof(CheckboxList), new PropertyMetadata(null));public static readonly DependencyProperty DisplayMemberPathProperty =DependencyProperty.Register("DisplayMemberPath", typeof(string), typeof(CheckboxList), new PropertyMetadata(string.Empty));private static ObservableCollection<InternalModel> _internalCollection;/// <summary>/// 数据源/// </summary>public IEnumerable ItemsSource{get { return GetValue(ItemsSourceProperty) as ObservableCollection<object>; }set { SetValue(ItemsSourceProperty, value); }}/// <summary>/// 选择项/// </summary>public ObservableCollection<object> SelectedItems{get { return GetValue(SelectedItemsProperty) as ObservableCollection<object>; }set { SetValue(SelectedItemsProperty, value); }}/// <summary>/// 显示字段/// </summary>public string DisplayMemberPath{get { return GetValue(DisplayMemberPathProperty) as string; }set { SetValue(DisplayMemberPathProperty, value);if (value != null)lst.ItemTemplate =(DataTemplate)XamlReader.Load(@"<DataTemplatexmlns=""""><CheckBox Content=""{Binding Value." +DisplayMemberPath +@", Mode=TwoWay}"" IsChecked=""{Binding Selected, Mode=TwoWay}""/></DataTemplate>");}}private static void ItemsSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e){((CheckboxList)obj).BuildInternalCollection(e.NewValue as IEnumerable);}private void BuildInternalCollection(IEnumerable collection){_internalCollection = new ObservableCollection<InternalModel>();foreach (var obj in collection){var nContainerItem = new InternalModel { Selected = false, Value = obj };nContainerItem.PropertyChanged += nContainerItem_PropertyChanged;_internalCollection.Add(nContainerItem);}lst.ItemsSource = _internalCollection;}void nContainerItem_PropertyChanged(object sender, PropertyChangedEventArgs e){if (SelectedItems == null)SelectedItems = new ObservableCollection<object>();SelectedItems.Clear();foreach (var o in _internalCollection.Where(internalModel => internalModel.Selected))SelectedItems.Add(o.Value);}#endregionpublic CheckboxList(){InitializeComponent();SelectedItems = new ObservableCollection<object>();}}public class InternalModel : INotifyPropertyChanged{public object Value { get; set; }private bool _selected;public bool Selected{get { return _selected; }set{_selected = value;NotifyPropertyChanged("Selected");}}public event PropertyChangedEventHandler PropertyChanged;public void NotifyPropertyChanged(string propertyName){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}}}主页面调用的方法

1.XAML

<UserControl x:Class="SilverlightApplication1.MainPage"xmlns=""xmlns:x=""xmlns:d=""xmlns:mc=""xmlns:local="clr-namespace:SilverlightApplication1"mc:Ignorable="d"d:DesignHeight="300" d:DesignWidth="400"><UserControl.Resources><local:People x:Key="folks"/></UserControl.Resources><Grid x:Name="LayoutRoot" Background="White"><Grid.RowDefinitions><RowDefinition Height="400"></RowDefinition><RowDefinition Height="40"></RowDefinition></Grid.RowDefinitions><local:CheckboxList x:Name="checkboxlist" ItemsSource="{Binding AllPeople,Source={StaticResource folks},Mode=TwoWay}" DisplayMemberPath="Name"/><Button Grid.Row="1" Content="显示选中项" Click="Button_Click" Width="60" HorizontalAlignment="Right" Margin="5"></Button></Grid></UserControl>2.CSnamespace SilverlightApplication1{public partial class MainPage : UserControl{public MainPage(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){string msg = string.Empty;ObservableCollection<object> list = checkboxlist.SelectedItems;foreach (var obj in list){Person per = obj as Person;msg += per.Name + "\n";}MessageBox.Show(msg);}}public class Person{public int ID { get; set; }public string Name { get; set; }}public class People{public People(){AllPeople = (from a in Enumerable.Range(1, 10)selectnew Person { ID = a, Name = "Name: " + a }).ToList();}public List<Person> AllPeople { get; set; }}}源码:Silverlight CheckBoxList

,生活不是等待风暴过去,而是学会在雨中翩翩起舞。

Silverlight CheckBoxList

相关文章:

你感兴趣的文章:

标签云: