sivlerlight 之 ListBox各种数据源绑定demo

本文介绍了一个使用 WPF 开发的 ListBox 控件实例,详细展示了如何通过 XAML 和 C# 定制 ListBox 的样式、数据绑定及交互效果。文章包括了完整的源代码和解释说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台XAM;:

<UserControl
    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:SampleData="clr-namespace:Expression.Blend.SampleData.SampleDataSource"
    mc:Ignorable="d"
    x:Name="userControl" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows" xmlns:System_Collections="clr-namespace:System.Collections;assembly=mscorlib"
    x:Class="Class2Samples.ListBox"
    d:DesignWidth="640" d:DesignHeight="480">
    <UserControl.Resources>
        <SampleData:SampleDataSource x:Key="SampleDataSource"/>
        <DataTemplate x:Key="DataTemplate">
            <Grid Width="360">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="5*"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Height="20" Source="{Binding Path=Content}"/>
                <TextBlock Margin="10,0,10,0" Grid.Column="1" Text="{Binding Path=Title}" TextWrapping="Wrap" d:LayoutOverrides="Width"/>
                <RadioButton Grid.Column="2" IsChecked="{Binding Path=Status}" d:LayoutOverrides="Height"/>
            </Grid>
        </DataTemplate>
        <Style x:Key="ListBoxItemStyle" TargetType="ListBoxItem">
            <Setter Property="Padding" Value="3"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="VerticalContentAlignment" Value="Top"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="TabNavigation" Value="Local"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="ListBoxItem">
                        <Grid Background="{TemplateBinding Background}" ToolTipService.ToolTip="{Binding Path=Amount}">
                            <vsm:VisualStateManager.VisualStateGroups>
                                <vsm:VisualStateGroup x:Name="CommonStates">
                                    <vsm:VisualState x:Name="Normal"/>
                                    <vsm:VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor" Storyboard.TargetProperty="Opacity">
                                                <SplineDoubleKeyFrame KeyTime="0" Value=".35"/>
                                            </DoubleAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity">
                                                <SplineDoubleKeyFrame KeyTime="0" Value=".55"/>
                                            </DoubleAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </vsm:VisualState>
                                </vsm:VisualStateGroup>
                                <vsm:VisualStateGroup x:Name="SelectionStates">
                                    <vsm:VisualState x:Name="Unselected"/>
                                    <vsm:VisualState x:Name="Selected">
                                        <Storyboard>
                                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="fillColor2" Storyboard.TargetProperty="Opacity">
                                                <SplineDoubleKeyFrame KeyTime="0" Value=".75"/>
                                            </DoubleAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </vsm:VisualState>
                                </vsm:VisualStateGroup>
                                <vsm:VisualStateGroup x:Name="FocusStates">
                                    <vsm:VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ObjectAnimationUsingKeyFrames Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Visibility">
                                                <DiscreteObjectKeyFrame KeyTime="0">
                                                    <DiscreteObjectKeyFrame.Value>
                                                        <Visibility>Visible</Visibility>
                                                    </DiscreteObjectKeyFrame.Value>
                                                </DiscreteObjectKeyFrame>
                                            </ObjectAnimationUsingKeyFrames>
                                            <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="(Shape.Stroke).(SolidColorBrush.Color)">
                                                <EasingColorKeyFrame KeyTime="00:00:00" Value="#FFD16D6D"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </vsm:VisualState>
                                    <vsm:VisualState x:Name="Unfocused"/>
                                </vsm:VisualStateGroup>
                            </vsm:VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="fillColor" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
                            <Rectangle x:Name="fillColor2" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
                            <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                            <Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1" Visibility="Collapsed"/>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <DataTemplate x:Key="DataTemplate1">
            <Grid MinWidth="100">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="2*"/>
                </Grid.ColumnDefinitions>
                <TextBlock MinWidth="20" Text="{Binding Path=Amount}" TextWrapping="Wrap"/>
                <TextBlock MinWidth="20" Grid.Column="1" Text="{Binding Path=Name}" TextWrapping="Wrap"/>
            </Grid>
        </DataTemplate>
        
        <ListBox x:Key="ArrayListDataSource">        
            <SampleData:Item Title="Praesent inceptos dictumst facilisi" Status="False" />
            <SampleData:Item Title="Praesent pulvinar torquent" Status="False" />
            <SampleData:Item Title="Inceptos facilisi" Status="True" />
            <SampleData:Item Title="Nascetur pharetra" Status="True" />
            <SampleData:Item Title="Eleifend praesent" Status="False" />
            <SampleData:Item Title="Facilisi sagittis maecenas" Status="True" />
            <SampleData:Item Title="Pharetra" Status="True" />
            <SampleData:Item Title="Suscipit senectus inceptos" Status="True" />
            <SampleData:Item Title="Lobortis" Status="False" />
            <SampleData:Item Title="Ultrices accumsan eleifend" Status="True" />
        </ListBox>
    </UserControl.Resources>
    <Grid x:Name="LayoutRoot">
        <ListBox ItemsSource="{Binding Items}" ItemTemplate="{StaticResource DataTemplate}" DataContext="{Binding Source={StaticResource ArrayListDataSource}}" Margin="0,50,272,66" VerticalAlignment="Stretch"/>
        <ListBox ItemsSource="{Binding Collection, Mode=OneWay}" ItemTemplate="{StaticResource DataTemplate}" d:DataContext="{Binding Source={StaticResource SampleDataSource}}" Margin="113,8,159,108" VerticalAlignment="Stretch"/>
        <ListBox Height="182" HorizontalAlignment="Right" Margin="0,50,8,0" VerticalAlignment="Top" Width="260" DisplayMemberPath="Name" ItemsSource="{Binding MyDatas, ElementName=userControl, Mode=OneWay}" ItemContainerStyle="{StaticResource ListBoxItemStyle}"/>
        <ListBox HorizontalAlignment="Right" Margin="0,236,8,66" Width="260" ItemsSource="{Binding MyDatas, ElementName=userControl, Mode=OneWay}" ItemContainerStyle="{StaticResource ListBoxItemStyle}" ItemTemplate="{StaticResource DataTemplate1}"/>
    </Grid>
</UserControl>

 

后台CS:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Expression.Blend.SampleData.SampleDataSource;
using System.Collections.ObjectModel;

namespace Class2Samples
{
    public partial class ListBox : UserControl
    {
        #region Initialize
        public ListBox()
        {
            // Required to initialize variables
            InitializeComponent();
            this.PrepareDatas();
        }

        private void PrepareDatas()
        {
            this.MyDatas = new ObservableCollection<MyDataType>();
            for (int i = 0; i < 10; i++)
            {
                this.MyDatas.Add(new MyDataType("name" + i, i * 5));
            }
        }
        #endregion

        #region DependencyProperties
        public ObservableCollection<MyDataType> MyDatas
        {
            get { return (ObservableCollection<MyDataType>)GetValue(MyDatasProperty); }
            set { SetValue(MyDatasProperty, value); }
        }

        public static readonly DependencyProperty MyDatasProperty =
            DependencyProperty.Register("MyDatas", typeof(ObservableCollection<MyDataType>), typeof(ListBox), new PropertyMetadata(null));
        #endregion

        #region Internal Classes
        public class MyDataType
        {
            public MyDataType(string name, int amount)
            {
                this.Name = name;
                this.Amount = amount;
            }

            public string Name
            {
                get;
                set;
            }

            public int Amount
            {
                get;
                set;
            }
        }
        #endregion
    }
}

 

 

转载于:https://www.cnblogs.com/eagle1986/archive/2012/07/25/2607522.html

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值