所以我有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.micro
和WPFLocalizationExtension
扩展程序。
答案 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列表的一部分。