带有VB.NET中自定义项的ListBox

时间:2014-01-09 18:39:58

标签: wpf vb.net visual-studio listbox

enter image description here

我想修改原始的ListBox控件,每个项目里面都有一个CheckBox,Labels和一个Button控件。

有没有最佳方法可以做到这一点?没有从一开始就制作自定义控件?

制作继承ListBox的自定义控件可能不是一个坏主意,但不知道如何...

谢谢!

我试过WPF,但此时太难了。实际上,通过XAML设计控件很简单,但管理列表项(添加/删除文本,从每个项目的按钮获取事件)不是。

2 个答案:

答案 0 :(得分:0)

除了使用WPF之外,最好的方法是创建一个自定义UserControl,它代表列表中的每个项目。然后,在表单中添加FlowLayoutPanel。将面板的AutoScroll属性设置为True。然后将其FlowDirection属性设置为TopToBottom。然后,为您需要添加到列表中的每个项目动态创建一个自定义控件,并调用面板的Controls.Add方法将它们添加到列表中。

答案 1 :(得分:0)

由于问题标记为[WPF],我将提供WPF答案:

任何面临WPF的开发人员都会立即尝试做的第一件事就是使用它,就好像它是winforms一样。这是一个很大的错误。

如果你正在使用WPF,你真的需要抛弃winforms等古老技术中使用的传统方法,理解并拥抱The WPF Mentality

在WPF中,您不是“添加/删除文本,从每个项目中的按钮获取事件”或其中任何一项,只是因为UI is not Data

而是定义一个简单的数据模型:

public class MyData
{
    public string MyText1 {get;set;}

    public string MyText2 {get;set;}
}

然后声明性地在UI中定义Data Bindings以将“show”此数据发送到UI,而不是“阅读”或“写作” “来自UI的数据:

<Window x:Class="WpfApplication14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication14"
        Title="MainWindow" Height="350" Width="525">
    <ListBox ItemsSource="{Binding}" HorizontalContentAlignment="Stretch">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Border Margin="5" Background="LightCyan" BorderBrush="LightSkyBlue" BorderThickness="2">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition/>
                            <ColumnDefinition/>
                        </Grid.ColumnDefinitions>

                        <Label Grid.Row="0" Grid.Column="0" Content="Text 1:" HorizontalAlignment="Right"/>
                        <Label Grid.Row="1" Grid.Column="0" Content="Text 2:" HorizontalAlignment="Right"/>

                        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding MyText1}"/>
                        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding MyText2}"/>

                        <Button Grid.Row="2" Grid.ColumnSpan="2" Content="Button" HorizontalAlignment="Center"/>
                    </Grid>
                </Border>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Window>

最后,您将窗口或视图的DataContext定义为相关实例或此类数据的集合:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        DataContext = Enumerable.Range(0,10)
                                .Select(x => new MyData()
                                {
                                    MyText1 = "Text1 - " + x.ToString(),
                                    MyText2 = "Text2 - " + x.ToString()
                                });
    }
}

所有这些导致:

enter image description here

请参阅?非常简单而美丽。

忘记winforms, WPF Rocks 。只需将我的代码复制并粘贴到File -> New Project -> WPF Application中,然后自行查看结果。