2010-12-02 2 views
0
<MenuItem Command="local:CommandLibrary.RegisterServiceCommand"> 
    <MenuItem.CommandParameter> 
     <MultiBinding Converter="{StaticResource TrayWindowViewModelConverterResource}"> 
      <MultiBinding.Bindings> 
       <Binding ElementName="Me" /> 
       <Binding FallbackValue="Parser" /> 
      </MultiBinding.Bindings> 
     </MultiBinding> 
    </MenuItem.CommandParameter> 
</MenuItem> 

public class TrayWindowViewModelConverter : IMultiValueConverter { 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { 
     var viewModel = new Window1ViewModel(); 

     foreach (var obj in values) { 
      if (obj is Window) 
       viewModel.Caller = obj as Window; 
      else if (obj is string) 
       viewModel.ServiceName = obj.ToString(); 
     } 

     return viewModel; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { 
     throw new NotImplementedException(); 
    } 
} 

버튼 cammand는 MenuItem과 완전히 동일합니다. 내가 MenuItem에 대한 변환기를 디버깅 할 때 values ​​매개 변수에는 두 개의 객체가 포함됩니다. DependencyProperty.UnsetValue (나는 이것에 대해 알지 못합니다) 및 MyContextMenu 객체.MenuItem에서 지정된 매개 변수를 보내지 않지만 Button 보내기가 필요한 이유

또한 SomeType을 매개 변수로 전달할 수 있습니까? 감사합니다

답변

1

MenuItems는 기본 시각적 트리 외부에 있으므로, 버튼과 같은 주변 요소와 이름 범위가 같지 않은 팝업에 있습니다. 바인딩하려고하면 "Me"요소가 MenuItem의 이름 범위 밖에 있으므로 ElementName 바인딩을 해결할 수 없습니다.

+0

감사합니다. 존.하지만 해결 방법이나 해결 방법은 무엇입니까? – Sadegh

+0

이와 같은 상황에서는 UI 요소가 아닌 데이터에 의존해야합니다. Window 인스턴스를 뷰 모델에 전달하는 대신 Window의 뷰 모델이나 그 일부를 전달하십시오. 그렇게하면 V-VM 레이어를 분리 할뿐만 아니라 Binding을 위해 상속 된 DataContext (여전히 MenuItems 및 ToolTips로 전달됨)를 활용할 수 있습니다. –