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があります

注: コードで使用されているコントロールという用語は、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 および dess プロパティを非公開として保持していましたが、それが実際に必要な変更であった可能性があります。private は変数を private にして set にし、get は変数にアクセスできるかどうかを教えてくれると思っていましたが、後で私は private outside が setter も private としていることに気付きました。

それでおしまい。

これは、私が必要としていたことを達成するための別の方法でしたが、マークアップで dataSource リストを指定する方法が必要です。

より多くの回答は大歓迎ですが、それまでは誰でも。

于 2013-06-04T12:15:30.120 に答える