在WPF中使用菜单项的命令

3

我有一个MenuItem,它使用一个CultureInfo列表作为itemsource。
我想要的是当选中一个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个回答

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>

哇!谢谢!它起作用了!你能再解释一下为什么“正常绑定”不起作用吗?还有其他的控件也会有相同的行为吗? - undefined
嘿,请看我的评论。我解释了为什么在你的情况下这个绑定不起作用。 - undefined

1
一个 菜单 与其余的 标记 有不同的逻辑树。因此,您需要像 Erti-Chris 建议的那样首先搜索正确的 DataContext。此外,每个 DataTemplate 都具有绑定的 ItemsSource 列表中类型 T 的 DataContext。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接