2010-08-19 3 views
0

UI 업데이트와 관련하여 WPF contextMenu에서 이상한 문제가 발생했습니다.WPF ContextMenu가 하위 항목을 잃습니다.

기본적으로 World라는 이름의 계층 적 목록을 만듭니다. 이 목록에는 국가가 포함되며 각 국가에는 도시가 포함됩니다. 이 목록을 label 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> 

` 코드 시작 부분에서 당신은 라벨에 마우스 오른쪽 단추로 누른 다음 버튼을 클릭하면, contextMenu를 표시

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

뒤에 업데이트 된 데이터와 함께 coorectly (즉, 런던이 삭제됨)

컨텍스트 메뉴를 표시하는 레이블을 처음 시작할 때 처음 UI를 업데이트 할 때 문제가 발생합니다. 그런 다음 컨텍스트 메뉴가 사라지도록 창의 어딘가를 클릭합니다. 그런 다음 버튼을 클릭하면 런던 시내가 삭제됩니다. 이제 라벨을 마우스 오른쪽 버튼으로 클릭하면 컨텍스트 메뉴가 국가 아이템과 함께 표시되지만시 항목과 함께 표시되지 않습니다

답변

1

ContextMenu ItemsSource를 World 사본으로 설정하고 생성 된 World의 인스턴스에 바인딩하지 않은 것처럼 보입니다. 당신의 코드 뒤에. UI를 객체 변경을 통지하지 않는 기본 List<T>으로하지만,

this.label_World.ContextMenu = new ContextMenu(); 

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

이 바인딩을 설정합니다 :

은 생성자에서이 코드를 사용, 바인딩으로 설정합니다. 당신은 System.Collections.ObjectModel.ObservableCollection<T>List<T>을 대체하여, 여러분의 인생을 더 쉽게 만들 수 있습니다 그리고 당신은 라인
CollectionViewSource.GetDefaultView(label_World.ContextMenu.ItemsSource).Refresh(); 

가 자동으로 상황에 맞는 메뉴 언제든지에게 세계 객체 변경 사항을 업데이트하기 때문에 런던을 삭제

제거 할 수 있습니다.

+0

대단히 감사합니다. Rachel 일반 목록 대신 observableCollection에서 이제 작동합니다! –

관련 문제