WPF ContextMenu теряет свои подпункты - PullRequest
0 голосов
/ 19 августа 2010

У меня странная проблема с 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.Затем вы щелкаете где-нибудь в окне, чтобы контекстное меню исчезло.Затем, если вы нажмете на кнопку, город Лондон будет удален.Теперь, когда вы щелкаете правой кнопкой мыши на ярлыке, контекстное меню появляется с элементом страны, но не с их подэлементами

1 Ответ

1 голос
/ 19 августа 2010

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

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

this.label_World.ContextMenu = new ContextMenu();

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...