1

我正在制作一个 Windows 应用商店应用程序。在 XAML 主页中,我有一个 ListView,我正在尝试将其绑定到代码隐藏文件中的可观察集合。

但我看到的是一个空白屏幕。为什么列表没有填充?

编辑:

我正在制作一个应用程序以在 XAML 中显示某些 UI 控件的名称,稍后我将在列表的每一行上添加单击事件以转到显示该控件演示的新页面,这就是为什么我使用名称 Control 作为模型. 我正在制作自己的简单厨房水槽应用程序。

这是MainPage.xaml

<ListView x:Name="listOfControls" ItemsSource="{Binding controlsDataSource}" SelectionChanged="listOfControls_SelectionChanged">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding name}"></TextBlock>
                <TextBlock Text="{Binding desc}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

这是MainPage.xaml.cs

注意:代码中使用的术语 Control 是我给模型类起的一个名称,它与 UI 控件无关。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace AllControls
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        private ObservableCollection<AllControls.Models.Control> controlsDataSource { get; set; }
        public MainPage()
        {
            this.InitializeComponent();
            this.controlsDataSource = new ObservableCollection<AllControls.Models.Control>();
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

        }

        void listOfControls_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {

        }
    }
}

这是模型,Control.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AllControls.Models
{
    class Control
    {
        private String name{ get;set;}
        private String desc { get; set; }
        public Control(String iName, String iDesc)
        {
            name = iName;
            desc = iDesc;

        }
    }

}
4

1 回答 1

0

所以,我得到了它的工作。

在 XAML 中,

而不是ItemsSource="{Binding controlsDataSource}",我只指定了ItemsSource="{Binding}

然后在代码隐藏文件的 MainPage 构造函数中,我以编程方式将 listView 控件的 DataContext 设置为 Array。

public MainPage()
        {
            this.InitializeComponent();
            this.controlsDataSource = new ObservableCollection<AllControls.Models.Control>();
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
            this.controlsDataSource.Add(new AllControls.Models.Control("ScrollViewer", "ScrollViewer Desc"));
            listOfControls.DataContext = controlsDataSource;      
  }

此外,我将 name 和 desc 属性保留为私有,我公开了,这可能是需要的实际更改。我认为 private 会使变量变为私有,set 和 get 会告诉它们是否可以访问,但后来我意识到 private 外部也使 setter 成为私有的。

而已。

这是完成我需要的另一种方法,但应该有一种方法可以在标记中指定数据源列表。

欢迎更多答案,但在此之前任何人。

于 2013-06-04T12:15:30.120 回答