• 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

  • 相关阅读:
    Windows消息机制
    inherited 为什么可以调用父类的private函数? [问题点数:100分,结帖人:h2plus0]
    C++Buidler6中需要注意的几个问题
    BGA封装芯片拆装全程纪实
    Delphi组件开发教程指南(四)组件生成过程(TWinControl)
    Delphi技巧集六 (等待执行完一个外部程序再执行另一个程序)
    C++ Builder高级应用开发指南
    干掉“Spirale”病毒
    完全看懂新世代x86指令集結構
    Delphi 组件撰写常问问题delphi 在整合环境中如何找出组件所产生的问题
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5182829.html
Copyright © 2020-2023  润新知