【问题标题】:Programmatically create listbox with datatemplate and binding data以编程方式使用数据模板和绑定数据创建列表框
【发布时间】:2013-10-29 05:25:52
【问题描述】:

我正在开发 Windows 商店应用程序。有没有办法以编程方式使用数据模板创建一个列表框,然后将数据绑定到数据模板项?

我已经创建了这个列表框,但现在我需要以编程方式创建相同的列表框,因为我需要动态创建 列表框(列表框的数量是动态的),

第二个问题:我需要将文本绑定到列表框数据模板项。有人知道有什么可以推荐给我吗?

XAML:

<ListBox x:Name="lbTransitNow" ItemsSource="{Binding  MyDataBusStationsCurrent}" SelectionChanged="LbTransitNow_OnSelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate >
            <StackPanel>
                <Grid x:Name="gridTodayBtn">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock x:Name="tbTransitStart" Grid.Column="0" Text="{Binding Lines_departure_date}" />
                    <TextBlock x:Name="tbTransitEnd" Grid.Column="1" Text="{Binding Lines_arrival_date}" />
                </Grid>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

代码:

foreach (var routs in cpStationsrs.RoutesList)
{
    foreach (var lines in routs.LinesList)
    {
        foreach (var stops in lines.StopsList)
        {
            _myDataBusStationsChoosen.Add(new BindingData
                {
                    Lines_stops_nameSub = stops.Name,
                    Lines_stops_timeSub = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, stops.Time.Hour, stops.Time.Minute, 0).ToString("dd.MM.yyyy -- HH:mm"),
                    Lines_nameSub = lines.Name,
                    ...
                });
        }
    }
}

OnPropertyChanged("MyDataBusStationsChoosen");

【问题讨论】:

  • 您可以在 WPF 中以编程方式创建 DataTemplate,但不能在 WinRT 中创建......该尚未完成的框架中的另一个缺失功能​​
  • 为什么需要以编程方式创建它,顺便说一句?
  • 您不能在 XAML 中将其创建为隐藏,然后在您准备好时将其可见性属性更改为可见吗?这将允许您像往常一样通过 XAML 进行所有绑定,但在您准备好之前不显示列表框。

标签: c# data-binding windows-8 listbox windows-store-apps


【解决方案1】:

据我所知,无法在 WinRT 中以编程方式创建 DataTemplate。但是,如果我正确理解您的问题,您可以为所有列表框重复使用相同的模板......所以您可以在资源中声明模板并在每个列表框中引用它。

<Page.Resources>
        <DataTemplate x:Key="myItemTemplate">
            <StackPanel>
                <Grid x:Name="gridTodayBtn">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="*"/>
                    </Grid.ColumnDefinitions>
                    <TextBlock x:Name="tbTransitStart" Grid.Column="0" Text="{Binding Lines_departure_date}" />
                    <TextBlock x:Name="tbTransitEnd" Grid.Column="1" Text="{Binding Lines_arrival_date}" />
                </Grid>
            </StackPanel>
        </DataTemplate>
</Page.Resources>

然后,在代码中:

var listBox = new ListBox { ItemTemplate = (DataTemplate)Resources["myItemTemplate"] }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多