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 + "\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)
                         select
                         new Person { ID = a, Name = "Name: " + a }
                     ).ToList();

        }
        public List<Person> AllPeople { get; set; }
    }

}

源码:Silverlight CheckBoxList

时间: 2024-08-07 00:10:48

Silverlight CheckBoxList的相关文章

ArcGIS API for Silverlight 调用GP服务准备---GP模型建立、发布、测试

原文:ArcGIS API for Silverlight 调用GP服务准备---GP模型建立.发布.测试 第一篇.GP降雨量等值线建模.发布及测试 在水利.气象等行业中,要在WebGIS中实现空间分析功能,如绘制等值线.等高线.等直面.缓冲区等都是经常遇到,经过一段时间的学习和研究,查阅ESRI文档,请教他人,终于可以说是初步实现了等值线功能,这里记录下来详细的操作步骤和图片说明,一方面是对此次努力的总结,另一方面希望也能给后来用到这方面的其他同志们,起个抛砖引玉的作用. 下一篇是关于Silv

ArcGIS API for Silverlight 点沿着线流动

原文:ArcGIS API for Silverlight 点沿着线流动 概述 前段时间做了一个项目,要求是有一些电力输送线,电力输送线或者石油管道都是有流动方向的,用户想做一个动态效果来模拟电力的输送.其实做简单了只要在线上标识个箭头就可以了.但也要是做成动态的,至少ArcEngine实现起来是有点麻烦的.但ArcGIS API for Silverlight可以解决这个问题. 实现思路 在地图上展示输送电力的线和模拟电力输送方向的电都是ArcGIS  API中定义的对象,否者这些数据在地图上

ArcGIS API for Silverlight中加载Google地形图(瓦片图)

原文:ArcGIS API for Silverlight中加载Google地形图(瓦片图) 在做水利.气象.土地等行业中,若能使用到Google的地形图那是再合适不过了,下面就介绍如何在ArcGIS API for Silverlight中加载Google地 形图.先上一个图,初步制作,待后续继续改进 ArcGIS API for Silverlight 中的ArcGISTiledMapServiceLayer图层,继承自TiledMapServiceLayer.如果想实现自己的缓存地图图 层

创建第一个ArcGIS API for Silverlight应用

原文:创建第一个ArcGIS API for Silverlight应用 在完成前面的开发环境搭建以后,接下来实现我们的第一个ArcGIS API forSilverlight应用程序. 接下来我们一步一步来操作: 1.  打开Visual Studio2010,创建一个Silverlight应用项目及一个宿主的Web网站,如下图: 2.创建好的应用程序结构如下,包括一个Silverlight应用和一个宿主的Web项目. 3.接着右键点击Silverlight项目中的引用,选择添加引用,如下图:

企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(2)

本书包含的章节内容 第一章:表现模式,以一个例子呈献给读者表现模式的发展历程,我们会用包括MVC和MVP在内的各种方式实现一个收费项目的例子.沿此方向,我们会发现每一种模式的问题所在,这也是触发设计模式发展的原因.本章还会说明如果应用不当,MVC和MVP这些依赖.Net事件的表现模式是怎么导致内存泄漏的.本章会谈论各种表现模式的优缺点,并且留给读者自我思考的问题,如为什么用MVVM设计模式来代替MVP或是MVC.第二章:介绍MVVM,包括使MVVM魅力四射的WPF和Silverlight的各种特

c#爬取Silverlight网页 2

此前的一篇文章:C#爬取Silverlight网页,描述了如何爬取加密的Silverlight网页,并以北京空气质量官网的破解进行了说明. 按此办法,我想继续破解由中山大学先进技术研究院开发的一系列的Silverlight网站,譬如福建省空气质量实时发布系统,却一无所获.关键在于找到密钥和盐值非常难.有时候reflector并不能工作. 其实我犯了一个错误,被此前的破解思路给羁绊了.下面我们以福建省空气质量实时发布系统为例,讲述如何破解此类的网站. 同北京空气质量站点一样,当用谷歌浏览器F12调

visifire 图表双坐标轴 silverlight

public void CreateChart(Grid oGrid, ObservableCollection<ListItem> lBaseOilBar)        {            foreach (ListItem li in lBaseOilBar)            {                //图表大小,框线                Chart chart = new MyCharts();                chart.Width =

silverlight 双坐标轴

public void CreateLine(Grid oGrid, string sTitle, string sTableName, bool ifGetSig, string sYUint, string sYUint2, string sYTitle1, string sYTitle2, string sYTitle3, string[] sXLabel, double[] dYValue1, double[] dYValue2, double[] dYValue3)        {

Silverlight的认识

Microsoft Silverlight是一个跨浏览器的.跨平台的插件.Silverlight提供灵活的编程模型,并可以很方便地集成到现有的网络应用程序中.Silverlight可以对运行在Mac或Windows上的主流浏览器提供高质量视频信息的快速.低成本的传递.对于开发设计人员而言,Silverlight是一种融合了微软的多种技术的Web呈现技术.它提供了一套开发框架,并通过使用基于向量的图像图层技术,支持任何尺寸图像的无缝整合,对基于asp .net.AJAX在内的Web开发环境实现了无