2010-08-19 18 views
0

У меня странная проблема с WPF contextMenu приветствует обновление пользовательского интерфейса!WPF ContextMenu потерял свои подпункты

В основном я создаю иерархический список под названием World. В этот список входят страны и каждая страна содержит города. Я привязываю этот список к метке contextMenu.

Я создаю кнопку, которая удаляет один город из этого списка.

Вот код

`

<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> 

` код позади

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(); 
    } 
} 

Если при запуске вы нажмете на кнопку, то вы щелкните правой кнопкой мыши на ярлыке, Контекстное появляются согласованно с обновленными данными (т.е. лондон удален)

Проблема обновления пользовательского интерфейса появляется, когда вы начинаете сначала щелкнуть правой кнопкой мыши на ярлыке, который отображает contextMenu. Затем вы щелкните где-нибудь в окне, чтобы контекстMenu исчез. Затем, если вы нажмете на кнопку, город Лондон удаляется. Теперь, когда вы щелкните правой кнопкой мыши на ярлыке, контекстMenu появится в поле «Позиция страны», но не в их подтемах.

ответ

1

Похоже, вы устанавливаете свой объект ConttextMenu ItemsSource в копию World и не привязываете его к экземпляру созданного мира в вашем коде.

Чтобы установить его в качестве привязки, используйте этот код в конструкторе:

this.label_World.ContextMenu = new ContextMenu(); 

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

Это установит связывание, однако по умолчанию List<T> не уведомляет UI, когда изменения объекта. Вы можете сделать вашу жизнь проще, заменив List<T> с System.Collections.ObjectModel.ObservableCollection<T>, а затем вы можете избавиться от линии

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

при удалении Лондона, потому что он будет автоматически обновлять контекстное меню в любой момент изменения мира объектов.

+0

Большое спасибо Rachel Теперь он работает с наблюдаемым набором вместо общего списка! –

Смежные вопросы