2010-08-19 16 views
0

J'ai un problème étrange avec WPF contextMenu concerne la mise à jour de l'interface utilisateur!WPF ContextMenu perdre ses sous-éléments

Fondamentalement, je crée une liste hiérarchique nommée World. cette liste contient des pays et chaque pays contient des villes. Je lie cette liste à un libellé contextMenu.

Je crée un bouton qui supprime une ville dans cette liste.

Voici le code

`

<Window.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type local:Country}" ItemsSource="{Binding Path=ListCity}"> 
     <TextBlock Text="{Binding Path=NameCountry}"/> 
    </HierarchicalDataTemplate> 

    <HierarchicalDataTemplate DataType="{x:Type local:City}"> 
     <TextBlock Text="{Binding Path=NameCity}"/> 
    </HierarchicalDataTemplate> 
</Window.Resources> 

<Grid> 
    <Button x:Name="btnDelete_London" Click="btnDelete_London_Click" VerticalAlignment="Top">Del London</Button> 

    <Label x:Name="label_World" Content="WORLD" VerticalAlignment="Bottom" HorizontalAlignment="Center" Background="Aqua"/> 

</Grid> 

Code ` derrière

public class Country 
{ 
    public string NameCountry { get; set; } 
    public List<City> ListCity { get; set; } 
} 

public class City 
{ 
    public string NameCity { get; set; } 
} 


public partial class MainWindow : Window 
{   
    List<Country> World = new List<Country>(); 
    Country USA = new Country(); 
    Country UK = new Country(); 
    City NY = new City(); 
    City LA = new City(); 
    City LD = new City(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     USA.NameCountry = "United-Sates"; 
     UK.NameCountry = "United Kingdom"; 

     NY.NameCity = "New-York";    
     LA.NameCity = "Los Angeles"; 
     LD.NameCity = "London"; 

     USA.ListCity = new List<City>(); 
     USA.ListCity.Add(NY); 
     USA.ListCity.Add(LA); 

     UK.ListCity = new List<City>(); 
     UK.ListCity.Add(LD); 

     World.Add(USA); 
     World.Add(UK); 

     this.label_World.ContextMenu= new ContextMenu(); 
     this.label_World.ContextMenu.ItemsSource = World;    
    } 

    private void btnDelete_London_Click(object sender, RoutedEventArgs e) 
    { 
     bool finded = false; 

     foreach (Country country in World) 
     { 
      foreach (City city in country.ListCity) 
      { 
       if (city.NameCity == "London") 
       {  
        country.ListCity.Remove(city);      
        finded = true; 
        break; 
       } 
      } 
      if(finded) break; 
     } 

     CollectionViewSource.GetDefaultView(label_World.ContextMenu.ItemsSource).Refresh(); 
    } 
} 

Si au début vous cliquez sur le bouton, vous faites un clic droit sur l'étiquette, l'contextMenu apparaît coorectement avec des données mises à jour (ie london supprimé)

Le problème de la mise à jour de l'interface utilisateur apparaît lorsque vous commencez par cliquer avec le bouton droit de la souris sur l'étiquette qui affiche le menu contextuel. Ensuite, vous cliquez quelque part dans la fenêtre pour faire disparaître le menu contextuel. Ensuite, si vous cliquez sur le bouton, la ville de Londres est supprimée. Maintenant, lorsque vous cliquez avec le bouton droit sur l'étiquette, le menu contextuel apparaît avec Country Item mais pas avec leur ville. Subitems

Répondre

1

Il semble que vous définissiez votre ItemsSource ContextMenu sur une copie de World, et que vous ne le liez pas à l'instance de World créée dans votre code derrière.

Pour le définir comme une liaison, utilisez ce code dans votre constructeur:

this.label_World.ContextMenu = new ContextMenu(); 

Binding worldBinding = new Binding(); 
worldBinding.Source = World; 
this.label_World.ContextMenu.SetBinding(ContextMenu.ItemsSourceProperty, worldBinding); 

Cela va régler la liaison, mais par défaut List<T> n'avertit pas l'interface utilisateur lorsqu'un change d'objet. Vous pouvez vous rendre la vie plus facile en remplaçant List<T> avec System.Collections.ObjectModel.ObservableCollection<T> et vous pouvez vous débarrasser de la ligne

CollectionViewSource.GetDefaultView(label_World.ContextMenu.ItemsSource).Refresh(); 

lorsque vous supprimez Londres car il mettra à jour automatiquement le menu contextuel quand l'objet change du monde.

+0

Merci beaucoup Rachel Cela fonctionne maintenant avec observableCollection au lieu de Generic List! –