2017-05-12 6 views
0

私のViewModelのListを私のページのListViewにバインドしようとしていますが、動作させることができません。ItemsSourceは常にnullです値が設定されます。なぜ私のListView ItemsSource null(uwp app c#)

これは私が全体を設定する方法です。

theese属性は私のXAMLでページタグに追加され

xmlns:viewmodels ="using:TimeMachine3.ViewModels" 
d:DataContext="{d:DesignInstance viewmodels:MasterViewModel}" 

私LisstViewは私master.csで

<ListView x:Name="lstMainMaster" ItemsSource="{Binding MyList}" SelectionChanged="lstMainMaster_SelectionChanged"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{x:Bind Name}"/> 
        <TextBlock Text="{x:Bind Number}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 

(ページコード)私は

private ViewModels.MasterViewModel viewmodel; 

    //constructor 
    public master() 
    { 
     this.InitializeComponent(); 
     this.Loaded += Master_Loaded; 
    } 

    private void Master_Loaded(object sender, RoutedEventArgs e) 
    { 
     viewmodel = new ViewModels.MasterViewModel(); 
     viewmodel.populate(); 
    } 
を持っていると定義されます

masterViewmodel(ページのビューモデル)にこのコードがあります

private ObservableCollection<Month> _myList; 
    public ObservableCollection<Month> MyList{ get {return _myList; } } 

    public void Populate() 
    { 
     _myList = new ObservableCollection<Month>(DataBase.GetMonths(2017)); 
    } 
+0

あなたのリストに値を設定する場所はいくつかありますか? –

+0

私は編集が完了したことを示すいくつかのコードで私の質問を編集しました。 viewModelは、Page.Loadedイベントハンドラで作成されます。作成後、Populate()がviewmodelで呼び出されます。 Populate()に入力しますList _myList List <> MyListが返すgetステートメント – narancha

答えて

0

DataContextが正しく設定されている場合、InotifyChangedインターフェイスを実装する必要はありません。

私は、データコンテキストが

xmlns:viewmodels ="using:TimeMachine3.ViewModels" 
enter code here`d:DataContext="{d:DesignInstance viewmodels:MasterViewModel}" 

から

<Page 
... 
xmlns:viewmodels ="using:TimeMachine3.ViewModels" 
.../> 
<Page.DataContext> 
    <viewmodels:MasterViewModel> 
</Page.DataContext> 

そして今のItemsSource右)のInitializeComponent(への呼び出しの後に設定され、私のリストがある場合に設定されている方法を変更私のListViewはコードを追加せずに更新されます(私はINotifyChangedを実装する必要はありません)

1

MyListが参照をロードした後で、ビューの変更を通知していない(INotifyPropertyChangedを介して)ことを通知したため、nullです。したがって、バインディングをリフレッシュする必要があることを示すビューはわかりません。

public void Populate() 
{ 
    _myList = new ObservableCollection<Month>(DataBase.GetMonths(2017)); 
    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(MyList))); 
} 

または同等のもの。

+0

もちろん私は愚かなScroog1を感じました;) – narancha

+0

心配しないでください。我々はすべてそこにいた:) – Scroog1

+0

私は(viewModelで) を呼び出すことによってINotifyChangedを実装しました。PropertyChanged?.Invoke(this、new PropertyChangedEventArgs( "MyList")); Listプロパティを変更した後、ビューでPropertyChangedを購読し、ItemsSourceをリセットします。それは本当にそれを行う正しい方法ですか?それとももっとスムースにする素晴らしいマジカルトリックがありますか? – narancha

関連する問題