• Silverlight CheckBoxList


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

    1.XAML

    <UserControl x:Class="SilverlightApplication1.CheckboxList"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        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.CS 

    namespace 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(
                            @"<DataTemplate
                    xmlns=""http://schemas.microsoft.com/client/2007"">
                    <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);
            }
            #endregion 
            public 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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        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.CS

    namespace 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 + "
    ";
                }
                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)
                             select
                             new Person { ID = a, Name = "Name: " + a }
                         ).ToList();
    
            }
            public List<Person> AllPeople { get; set; }
        }
         
    }


    源代码:Silverlight CheckBoxList

  • 相关阅读:
    标准输出stdout、标准错误stderr 分类: python python基础学习 2013-06-17 18:08 308人阅读 评论(0) 收藏
    python数据持久存储:pickle模块的基本使用 分类: python python基础学习 python 小练习 2013-06-17 14:41 209人阅读 评论(0) 收藏
    解析XML文件总结 分类: python基础学习 python 2013-06-17 12:04 232人阅读 评论(0) 收藏
    使用set()求出列表交集 分类: python基础学习 2013-06-16 17:00 241人阅读 评论(0) 收藏
    [搜索][51nod] 1268 和为K的组合
    [51nod] 1279 扔盘子
    [记忆化搜索] [洛谷] P1464 Function
    [贪心][51nod] 1133 不重叠的线段
    [二分] [51nod]1010 只包含因子2 3 5的数 lower_boud
    万年历查询 c++ 黑窗
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5182829.html
Copyright © 2020-2023  润新知