WPF ListBox不显示任何内容

时间:2019-11-08 12:27:46

标签: c# wpf data-binding listbox

我遇到了ListBox问题。我正在尝试用数据库中的数据填充它,但是列表框没有显示。我已经看过许多类似的问题,但没有找到对我有用的答案:( 我的ListBox代码:

<ListBox x:Name="OrdersListBox" Grid.Row="1"  VerticalContentAlignment="Center" ItemTemplate="{StaticResource OrdersTemplate}">
</ListBox>

对于OrdersTemplate:

<DataTemplate x:Key="OrdersTemplate">
                <StackPanel>
                    <DockPanel DockPanel.Dock="Left" DataContext="{StaticResource OrdersViewSource}">
                        <TextBlock Text="OrderID: " FontSize="18"/>
                        <TextBlock Text="{Binding OrderID}" FontSize="18"/>
                    </DockPanel>
                </StackPanel>
            </DataTemplate>

页面代码:

    public partial class Account : Page
    {
        Entities1 Context;
        Customers Customer;
        CollectionViewSource OrdersViewSource;
        public Account(Entities1 Context, Customers Customer)
        {
            InitializeComponent();
            this.Context = Context;
            this.Customer = Customer;
            this.OrdersViewSource = this.FindResource("OrdersViewSource") as CollectionViewSource;
            DataContext = this;
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Context.Orders.Load();
            this.OrdersViewSource.Source = Context.Orders.Local.Where(o => o.CustomerName == Customer.CompanyName).Select(o => o);
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            Orders Order = new Orders
            {
                CustomerName = Customer.CompanyName
            };
            NewOrder NewOrder = new NewOrder(Context, Order);
            this.NavigationService.Navigate(NewOrder);

        }
    }

我在Grid.Resources中也有这个

            <CollectionViewSource x:Key="OrdersViewSource"/>

我非常确定绑定是有效的,因为以这种方式调用ListBox时会导致这种情况:

<ListBox x:Name="OrdersListBox" Grid.Row="1"  VerticalContentAlignment="Center" ItemTemplate="{StaticResource OrdersTemplate}">
                <DockPanel/>
            </ListBox>

它显示第一个OrderID元素。

为什么在运行我的应用程序时看不到任何列表框?

1 个答案:

答案 0 :(得分:1)

好吧,您要做的就是将ItemTemplate绑定到所需的资源。应该改为ItemsSource。 当您手动添加项目时,列表会尝试使用您提供的模板(即您的实际数据)来呈现您的项目。

您可能想要执行以下操作:

<ListBox x:Name="OrdersListBox" Grid.Row="1" 
         VerticalContentAlignment="Center" 
         ItemTemplate="{StaticResource OrdersTemplate}"
         ItemsSource="{Binding Source={StaticResource OrdersViewSource}}">
</ListBox>

然后像这样删除模板上的数据绑定:

<DataTemplate x:Key="OrdersTemplate">
    <StackPanel>
        <DockPanel DockPanel.Dock="Left">
            <TextBlock Text="OrderID: " FontSize="18"/>
            <TextBlock Text="{Binding OrderID}" FontSize="18"/>
        </DockPanel>
    </StackPanel>
</DataTemplate>

我不确定这是否可行,因为我不知道OrdersViewSource中的数据是否是您想要显示在列表中的实际项目,但是您知道了。

您需要一个分配给列表的ItemsSource属性的项目数组。