2014-07-12 2 views
0

이것을 상상해보십시오 : 같은 메뉴 인 컨텍스트 메뉴를 갖고 싶은 컨트롤이 여러 개 있습니다. 해당 컨텍스트 메뉴는 동적이며 언제든지 변경 될 수 있습니다. 그래서이 같은 정적 클래스를 만들 :동일한 동적 컨텍스트 메뉴를 동적 인 사용자 컨트롤 수에 바인딩하는 방법은 무엇입니까?

public static class EmployeeContextMenu 
{ 
    private static ContextMenu EmployeeMenu { get; set; } 

    static EmployeeContextMenu() 
    { 
     EmployeeMenu = new ContextMenu(); 
    } 

    public static ContextMenu Get() 
    { 
     return EmployeeMenu; 
    } 

    public static void Set(List<String> employees) 
    { 
     EmployeeMenu = new ContextMenu(); 
     MenuItem mi; 
     foreach (var item in employees) 
     { 
      mi = new MenuItem(); 
      mi.Header = item; 
      EmployeeMenu.Items.Add(mi); 
     } 
    } 
} 

을 그리고 어떤 시점에서 당신이 메뉴 항목을 변경하고 위의 설정 방법을 사용할 필요가 완벽하게 잘 작동합니다. 어떻게 든 컨트롤 컨텍스트 메뉴를 Get 메서드에 바인딩하려고합니다. 처럼 달성 될 수 있습니다

<Window.Resources> 
    <ObjectDataProvider ObjectType="{x:Type local:EmployeeContextMenu}" MethodName="Get" x:Key="myCM" /> 
</Window.Resources> 
<Grid> 
    <TextBlock Name="tb" ContextMenu="{Binding Source={StaticResource myCM}}" /> 
</Grid> 

물론 당신은 컨트롤의 상황에 맞는 메뉴가 곧 정적 설정 메소드가 호출 될 때 업데이트 할.

하지만 위의 내용은 기본적으로 바인딩에 문제가있는 것입니다 ... 컨텍스트 메뉴가 전혀 표시되지 않습니다. 그러면 바인딩을 어떻게 설정 하시겠습니까? Datacontext, 데이터 소스? 어디서 어떻게?

당신이

tb.ContextMenu = EmployeeContextMenu.Get(); 

을 구현하지만 당신은 당신이 심하게 될 것입니다 언급 한 상황에 맞는 메뉴를 갖고 싶어 동적으로 생성 된 사용자 컨트롤의 알 수없는 번호가있는 경우 그 나쁜 솔루션이 될 것입니다 경우는 물론 작업의 것 즉시 업데이 트되었습니다. 당신이 할 수있는 일

+0

바인딩이 정상적으로 보입니다. 'EmployeeMenu'가 비어 있지 않습니까? (먼저'Set' 메소드를 통해 항목을 설정해야합니다). 또한 Binding에 문제가 있다면,'Output' 윈도우를 살펴볼 수 있습니다. 거기에 메시지가 있어야합니다. –

답변

0

그래서 난 INotifyPropertyChanged을 구현 한

namespace CSharpWPF 
{ 
    public sealed class EmployeeContextMenu : INotifyPropertyChanged 
    { 
     private EmployeeContextMenu() 
     { 
      //prevent init 
     } 

     static EmployeeContextMenu() 
     { 
      Instance = new EmployeeContextMenu(); 
      Instance.EmployeeMenu = new ContextMenu(); 
     } 

     public static EmployeeContextMenu Instance { get; private set; } 

     private ContextMenu _menu; 
     public ContextMenu EmployeeMenu 
     { 
      get 
      { 
       return _menu; 
      } 
      set 
      { 
       _menu = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("EmployeeMenu")); 
      } 
     } 

     public void Set(List<String> employees) 
     { 
      EmployeeMenu = new ContextMenu(); 
      MenuItem mi; 
      foreach (var item in employees) 
      { 
       mi = new MenuItem(); 
       mi.Header = item; 
       EmployeeMenu.Items.Add(mi); 
      } 
     } 
     public event PropertyChangedEventHandler PropertyChanged; 
    } 
} 

클래스 자체에 의해 시작 Set() 방법 후 업데이트하기 위해 당신이 EmployeeMenu 속성에 대한 change notification을 필요로 조금을 구조 조정하는 것입니다 초기화를 피하기 위해 개인 생성자를 사용하지 않고 정적으로 만들었습니다. 더 파생되지 않도록 클래스를 봉인했습니다. 정적 추가 Instance xaml에서 볼 수있는 속성

나머지는 아주 기본적인

XAML

<Grid xmlns:l="clr-namespace:CSharpWPF"> 
    <TextBlock Name="tb" ContextMenu="{Binding EmployeeMenu,Source={x:Static l:EmployeeContextMenu.Instance}}" /> 
</Grid> 

정적 참조

을 유지하면서

EmployeeContextMenu.Instance.Set(list); 

그래서 그것을 가능하게하는 모든 생각이 속성은 통지를 변경() 메소드 세트를 호출

+0

나는 어떤 종류의 알림이 필요하다고 느꼈지만 정적 클래스에 적용 할 수 없어서 거기서 붙어있었습니다. 너의 길은 완벽 해! – user3751677

+0

나는 그것이 당신, 행복 코딩을 위해 일한 것을 기쁘게 생각합니다 :) – pushpraj

관련 문제