2013-05-17 4 views
2

그래서이 MenuItem은 itemsource로 CultureInfo의 목록을 사용하고 있습니다.
내가하고자하는 것은 CultureInfo이 클릭/선택되었을 때 기능을 실행하는 것입니다.이 기능은 선택한 cultureinfo로 응용 프로그램의 현지화를 변경해야합니다. 나는 함수가 정상적으로 작동한다고 안전하게 말할 수 있습니다. 연구 및 몇 가지 예를하려고하면, 이것은 내가 불행하게도 작동하지 않는, 함께 결국 무엇을 :WPF에서 MenuItem의 명령 사용

<MenuItem Header="{lex:LocText MenuLanguages}" ItemsSource="{Binding LanguageList}" DisplayMemberPath="Name"> 
     <MenuItem.ItemContainerStyle> 
      <Style> 
       <Setter Property="MenuItem.Command" Value="{Binding SetLanguage}" /> 
       <Setter Property="MenuItem.CommandParameter" Value="{Binding}" /> 
      </Style> 
     </MenuItem.ItemContainerStyle> 
</MenuItem> 

명령 :

private ICommand _SetLanguage; 
    public ICommand SetLanguage 
    { 
     get 
     { 
      if (_SetLanguage == null) 
       _SetLanguage = new RelayCommand(ChangeLanguage); 
      return _SetLanguage; 
     } 
    } 

    public void ChangeLanguage(object langChosen) 
    { 
     LocalizeDictionary.Instance.Culture = CultureInfo.GetCultureInfo(langChosen.ToString()); 
    } 

CultureInfo.GetCultureInfo() 매개 변수로 문자열을 사용합니다.
itemsource는 기본적으로 ObservableCollection<CultureInfo>입니다.

제 질문은 위의 코드에 무엇이 잘못 되었을까요? 나는 꽤 많은 '해결책'을 시도해 왔지만 실제로는 아무 것도하지 못했습니다 ...
항목 양식을 선택하면 아무 일도 일어나지 않습니다.

* ChangeLanguage 메서드에 중단 점을 설정하려고 시도했기 때문에 메서드가 실행되지 않는다고 결론 내릴 수있었습니다.

caliburn.microWPFLocalizationExtension 확장자를 사용합니다.

답변

3

작동하지 않는 경우 바인딩이 잘못되었습니다. 디버그 창에서 바인딩 오류를 확인하십시오. 바인딩은 직접 수행하지 않을 것이기 때문에 친척 소스를 사용해야합니다.

<MenuItem Header="_Recent files" ItemsSource="{Binding RecentFiles, Converter={StaticResource RecentFilesToListOfStringsConverter}, Mode=OneWay}" > 
    <MenuItem.ItemContainerStyle> 
     <Style TargetType="{x:Type MenuItem}"> 
      <Setter Property="Command" Value="{Binding DataContext.ImportRecentItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type MenuItem}, AncestorLevel=1}}" /> 
      <Setter Property="CommandParameter" Value="{Binding}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 
+0

감사합니다. 그것은 작동합니다! '정상 바인딩'이 작동하지 않는 이유를 조금 더 설명 할 수 있습니까? 같은 행동을하는 다른 컨트롤이 있습니까? – Asaf

+0

이봐, 내 말 좀 봐. 나는 왜이 바인딩이 당신의 경우에 효과가 없었는지 설명했다. –

1

MenuMarkup의 나머지는 다른 LogicalTree 있습니다. 이 이유 때문에 Erti-Chris가 제안한대로 먼저 DataContext을 검색해야합니다.

또한 모든 DataTemplate에는 바인딩 된 ItemsSource 목록의 일부인 Type T의 DataContext가 있습니다.