2010-11-02 5 views
3

J'ai dans mon Xaml un contrôle de pivot:"Actualiser" Pivot commande avec boîte à outils MVVM-lumière pour WP7

<controls:Pivot ItemsSource="{Binding ObjectList}"> 
     <controls:Pivot.HeaderTemplate> 
      <DataTemplate> 
       <TextBlock /> 
      </DataTemplate> 
     </controls:Pivot.HeaderTemplate> 
     <controls:Pivot.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Value1}" /> 
        <TextBlock Text="{Binding Value2}" /> 
       </StackPanel> 
      </DataTemplate> 
     </controls:Pivot.ItemTemplate> 
    </controls:Pivot>  

Mon ViewModel est:

public class MyObject 
{ 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
} 

public class MyViewModel : ViewModelBase 
{ 
    public const string ObjectListPropertyName = "ObjectList"; 
    private ObservableCollection<MyObject> _objectList; 
    public ObservableCollection<MyObject> ObjectList 
    { 
     get 
     { 
      return _objectList; 
     } 

     private set 
     { 
      if (_objectList == value) 
       return; 
      _objectList = value; 
      RaisePropertyChanged(ObjectListPropertyName); 
     } 
    } 

    private DispatcherTimer timer; 

    public MyViewModel() 
    { 
     ObservableCollection<MyObject> collection = new ObservableCollection<MyObject> 
          { 
           new MyObject {Value1 = "One"}, 
           new MyObject {Value1 = "Two"}, 
           new MyObject {Value1 = "Tree"} 
          }; 
     ObjectList = collection; 
     timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2)}; 
     timer.Tick += timer_Tick; 
     timer.Start(); 
    } 

    void timer_Tick(object sender, EventArgs e) 
    { 
     foreach (MyObject myObject in _objectList) 
     { 
      myObject.Value2 = "Something"; 
     } 
     Application.Current.RootVisual.Dispatcher.BeginInvoke(() => RaisePropertyChanged(ObjectListPropertyName)); 
    } 
} 

Lorsque le timer_tick est atteint, je suppose le contrôle du pivot pour actualiser avec les nouvelles valeurs ... mais je ne peux pas voir les changements.

Qu'est-ce qui me manque?

Merci d'avance pour votre aide

Répondre

2

Je suppose que peut-être mettre à jour les membres de la liste sans mettre à jour la liste elle-même est le problème. Lorsque vous augmentez la propriété a changé d'événement - c'est pour l'ensemble de la collection. La collection pointe toujours vers une référence égale de lui-même, en dépit du fait que les membres ont changé. Essayez de placer un point d'arrêt dans le setter et vérifiez si la propriété a changé d'événement.

+0

vous semblez avoir raison, si je fais: for (int i = 0; i <_objectList.Count; i ++) { _objectList [i] = new MyObject {Valeur1 = _objectList [i] .Value1, Valeur2 = "Quelque chose"}; } ça marche ... – Tim

+0

est-ce un bon moyen? ou juste une mauvaise solution de contournement: D – Tim

+0

Je pensais que peut-être vous pouvez créer une nouvelle liste de MyObjects, peupler cela avec les nouvelles valeurs (avec foreach ou for-next, de toute façon), puis définir la liste originale à cette nouvelle temporaire liste. cela modifierait en fait la liste et permettrait à l'événement de se déclencher. Ce n'est pas joli, mais vu l'exemple, ça devrait marcher. – Chazmanian

Questions connexes