2013-10-24 9 views
1

Я новичок в MVVM и пытаюсь преобразовать рабочую программу в программу MVVM. Я искал ответ для этого, но до сих пор не повезло.mvvm binding selecteditem для обновления listview

В основном, что у меня есть: список и список. Список заполнен Trainstations, и я хочу, чтобы время со станции находилось в списке (с задержкой и т. Д.). Список заполняется станциями, и я всякий раз, когда я выбираю станцию, он обновляется, и я имею его в переменной под названием «CurrentStation». Теперь я использую эту «CurrentStation», чтобы получить список ObservableCollection всех отправлений с этой станции, но по какой-то причине функция вызывается только один раз и не обновляется при выборе другой станции.

Я также не знаю, что связать в коде xaml.

<ListBox x:Name="lstStations" Margin="8" Grid.Row="1" ItemsSource="{Binding StationList}" SelectedItem="{Binding CurrentStation}" DisplayMemberPath="Name"/> 
     <ListView Grid.Column="1" Margin="8" Grid.Row="1" ItemsSource="{Binding Departures}" > 
      <ListView.View> 
       <GridView> 
        <GridViewColumn DisplayMemberBinding="{Binding Time, StringFormat=t}" Header="Time" /> 
        <GridViewColumn DisplayMemberBinding="{Binding Delay, Converter={StaticResource mijnDelayConverter}}" Header="Delay"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Station}" Header="Station"/> 
        <GridViewColumn DisplayMemberBinding="{Binding Vehicle}" Header="Vehicle"/> 
        <GridViewColumn Header="Platform" CellTemplate="{DynamicResource dataTemplateTextblock}" /> 
<!-- Haven't had the chance to look at this^I don't think this is correct though --> 
        </GridView> 
       </ListView.View> 
      </ListView> 

А вот код ViewModel:

 public string Name 
     { 
      get 
      { 
       return "MainPage"; 
      } 
     } 
     public ObservableCollection<Station> StationList 
     { 
      get 
      { 
       return Station.GetStations(); 
      } 
     } 
     private Station _currentStation; 
     public Station CurrentStation 
     { 
      get 
      { 
       return _currentStation; 
      } 
      set 
      { 
       _currentStation = value; 
       Console.WriteLine("New station selected: " + _currentStation.ToString()); 
       OnPropertyChanged("CurrentStation"); 
      } 
     } 
     private ObservableCollection<Departure> _departures; 
     public ObservableCollection<Departure> Departures 
     { 
      get 
      { 
       return Departure.GetDepartures(CurrentStation); 
      } 
      set 
      { 
       _departures = value; 
      } 
     } 
+0

Upvoted AIRL , но интересно, используете ли вы какие-либо фреймворки и как вы обрабатываете свой OnPropertyChanged ... – Noctis

ответ

3

Я думаю, что вам нужно:

  • Update Departures свойство явно, это может быть сделано внутри CurrentStation сеттер

    private Station _currentStation; 
    public Station CurrentStation 
    { 
        get 
        { 
         return _currentStation; 
        } 
        set 
        { 
         _currentStation = value; 
         Departures = Departure.GetDepartures(_currentStation); 
         Console.WriteLine("New station selected: " + _currentStation.ToString()); 
         OnPropertyChanged("CurrentStation"); 
        } 
    } 
    
  • Trigger уведомление об изменении, которое освежит ваши вылеты связывания (и ListBox!) С известным OnPropertyChanged

    private ObservableCollection<Departure> _departures; 
    public ObservableCollection<Departure> Departures 
    { 
        get 
        { 
         return _departures 
        } 
        set 
        { 
         _departures = value; 
         OnPropertyChanged("Departures"); 
        } 
    } 
    
0

Вы должны установить OnPropertyChanged на коллекции Observabe слишком

public ObservableCollection<Departure> Departures 
    { 
     get 
     { 
      return Departure.GetDepartures(CurrentStation); 
     } 
     set 
     { 
      _departures = value; OnPropertyChanged("Departures") 
     } 
    } 
Смежные вопросы