2011-11-30 7 views
2

저는 C#을 사용하고 있으며 객체 목록을 가지고 있으며 컨텍스트 메뉴에 모든 객체를 표시하려고합니다. 각 객체는 MenuItem으로 표시됩니다.ListItem에 MenuItem을 동적으로 연결합니다.

하나의 MenuItem을 클릭하면 MenuItem_Click() 함수에서 연결된 객체를 참조하려고합니다. Tag 속성을 사용 :

List<MyObject> MyList = new List<MyObject>(); 
ContextMenu menu = new ContextMenu(); 

foreach(MyObject o in MyList) 
{ 
    MenuItem item = new MenuItem(); 
    item.Header = o.Name; 
    item.Click += MenuItem_Click; 
    menu.Items.add(item); 
} 

menu.IsOpen=true; 

void MenuItem_Click(object sender, RoutedEventArgs e){ 

    // Assume the 5th MenuItem is clicked, I need to refer to the 5th object in MyList 
    // how to do it? 

} 

답변

0

현재이 코드에 맞는 빠른 더러운 해킹하여 액세스 할 수 있습니다.

private void MenuItem_Click(object sender, RoutedEventArgs e) 
{ 
    var myObj = (MyObject)((MenuItem)sender).Tag; 
} 
+0

투표 결과에도 불구하고,이 솔루션은 그가 제공 한 프레임 워크 내 OP의 질문에 실제로 대답합니다 *. – slugster

+0

내 경우 완벽하게 작동합니다. 왜 "더러운"해킹으로 간주됩니다 궁금하네요 ... 태그 속성이 이런 일을해야 아닌가요? – LazNiko

+0

@Laz - 태그는 범용 속성으로 존재하며 AFAIK는 VB의 컨트롤에 도입 된 이후로 그런 용도로 사용되었습니다. 개인적으로 선호하는 메서드가 아니므로 ListView를 사용하여 데이터 바인딩을 사용하고 각 TemplateItem을 MenuItem으로 지정한 다음 Command (바인딩 된 MyObject를 CommandParameter로 전달)를 대상으로 지정합니다. 시간이 지나면 오늘 나중에 샘플을 올릴 수 있습니다. – slugster

0

당신은

MenuItem nItem = sender as MenuItem; 
+0

이것은 MenuItem의를 가져가, 영업 이익은 MenuItem의 이식에 사용 된 데이터 개체를 원하는 :

foreach(MyObject o in MyList) { MenuItem item = new MenuItem(); item.Header = o.Name; item.Tag = o; item.Click += MenuItem_Click; menu.Items.add(item); } 

다음은이 방법을 참조 할 수 있습니다. – slugster

0
var clickedItem = e.OriginalSource as MenuItem; 
MyObject myObj = MyList.Find(o => o.Name == clickedItem.Header); 
+0

-1 이것이 MyObject 인스턴스를 얻는 데 도움이되는 방법 – Zlobaton

+0

코드를 살펴보면 item.Header == o.Name이므로 MyList.Find (o => o.Name == clickedItem.Header); Answer – Dave

+0

@Dave, 제 경우에는 이름이 제 경우의 안전한 식별자가 아니지만, 당신의 생각이 다른 경우에 효과가 있다고 생각합니다. – LazNiko

관련 문제