0

Win8 アプリケーションの XAML ページにリスト ビュー コントロールを設定しようとしています。ページ XAML に次の属性を追加しました。

<common:LayoutAwarePage x:Class="SecAviTools.ViewWeatherHome"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:common="using:MyNameSpace.Common"
                    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                    xmlns:local="using:MyNameSpace"
                    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
                    xmlns:viewmodel="using:MyNameSpace.Win8ViewModel"
                    x:Name="pageRoot"
                    DataContext="{Binding DefaultViewModel,
                                          RelativeSource={RelativeSource Self}}"
                    mc:Ignorable="d">

<!-- ... -->

<ListView ItemsSource="{Binding Path=viewmodel:Stations}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Path=Id}"/>
                <TextBlock Text="{Binding Path=Name}"/>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

私のソースクラスは次のとおりです。

namespace MyNameSpace.Win8ViewModel
{
    public class Stations : INotifyPropertyChanged, INotifyCollectionChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event NotifyCollectionChangedEventHandler CollectionChanged;
        protected void OnCollectionChanged<T>(NotifyCollectionChangedAction action, ObservableCollection<T> items)
        {
            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(action, items));
        }

        public Stations()
        {
            AllStations = new ObservableCollection<Station>();
            AddStations(new List<Station>());
        }

        public ObservableCollection<Station> AllStations { get; private set; }

        public void AddStations(List<Station> stations)
        {
            AllStations.Clear();
            foreach (var station in stations)
                AllStations.Add(station);

            OnCollectionChanged(NotifyCollectionChangedAction.Reset, AllStations);
            OnPropertyChanged("AllStations");
        }
    }

    public class Station
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
}

ページには、次のことを行うボタン (ここには表示されていません) もあります。

public sealed partial class MyPage : MyNameSpace.Common.LayoutAwarePage
{
    private Stations m_Stations = new Stations();

    //...

    private async void SearchButtonClick(object sender, RoutedEventArgs e)
    {
        var list = new List<Station>();
        list.Add(new Station() { Id = 0, Name = "Zero" });
        list.Add(new Station() { Id = 1, Name = "One" });

        m_Stations.AddStations(list);
    }
}

ただし、コードを実行すると、リスト ビューに何も表示されません。私は何が欠けていますか?

ティア

4

1 に答える 1

0

DefaultViewModel が何であるかは示されていませんが、表示されているクラス Stations のインスタンスに設定されていると仮定します。その場合、次のようにバインドする必要があります。

<ListView ItemsSource="{Binding Path=AllStations}">

バインディングのパスは通常、どこかのプロパティを参照します。Source など、それ以上の指定がない場合、DataContext に設定されているのはオブジェクトのプロパティです。

とにかく、名前空間修飾子「viewmodel:」は必要ありません。

余談ですが、ObservableCollection にバインドする場合は、INotifyCollectionChanged を実装する必要はありません。AllStations プロパティが設定されている場合は INotifyPropertyChanged のみを実装してください。

于 2013-02-25T15:55:37.050 に答える