在WPF中使用MenuItem的命令

时间:2013-05-17 04:33:51

标签: c# wpf mvvm

所以我有MenuItem使用CultureInfo s列表作为项目来源。
我想要做的是在单击/选择CultureInfo时触发一个函数,这应该会将应用程序的本地化更改为所选的cultureinfo。 我可以肯定地说,该功能正常运作。 在研究并尝试了几个例子之后,这就是我最终得到的结果,遗憾的是它不起作用:

<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扩展程序。

2 个答案:

答案 0 :(得分:3)

如果不起作用,则绑定错误。检查调试窗口中的绑定错误。 你需要使用relativesource,因为直接绑定不会做你认为会做的事情。

    <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>

答案 1 :(得分:1)

Menu的LogicalTree与Markup的其余部分不同。对于这个原因,您需要首先搜索正确的DataContext,因为Erti-Chris建议。

此外,每个DataTemplate都有Type T的DataContext,它是绑定ItemsSource列表的一部分。