我是 WPF 的新手,不幸的是我習慣于只使用 WinForms。我想就裝訂征求意見。

我想填充語言的選單項,如下圖所示

我在 viewModel 中獲得了以語言名稱為鍵和 bool 作為值的字典:
internal Dictionary<string,bool> Languages { get; set; }
#endregion
public MainWindowViewModel()
{
Loc = new Locale(CurrentLanguage);
Languages = Loc.GetAvailableLanguages();
}
我已經通過將它們添加到 MainWindowView.xaml 檔案后面的代碼中來處理它:
public partial class MainWindow : Window
{
MainWindowViewModel viewModel;
public MainWindow()
{
viewModel = new MainWindowViewModel();
DataContext = viewModel;
InitializeComponent();
PopulateMILanguages();
}
private void PopulateMILanguages()
{
foreach (var lng in viewModel.Languages)
{
MenuItem mi = new MenuItem();
mi.IsCheckable = true;
mi.Header = lng.Key;
mi.Checked = Mi_Checked;
MI_Lngs.Items.Add(mi);
mi.IsChecked = lng.Value;
if (lng.Key.ToLowerInvariant() ==
Settings.Default.LastSelectedLanguage.ToLowerInvariant())
{
mi.IsChecked = true;
}
}
}
private void Mi_Checked(object sender, RoutedEventArgs e)
{
MenuItem menuItem = sender as MenuItem;
viewModel.CurrentLanguage = menuItem.Header.ToString()
.ToLowerInvariant();
Settings.Default.LastSelectedLanguage=viewModel.CurrentLanguage;
foreach (MenuItem mi in MI_Lngs.Items)
{
if (mi.Header != menuItem.Header)
{
mi.IsChecked = false;
}
}
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Settings.Default.Save();
}
}
我真的不喜歡這個解決方案,但我無法處理它來填充 xaml 中的集合:
<!-- LANGUAGE -->
<MenuItem x:Name="MI_Lngs" Header="{Binding Loc[Lng]}"
Style="{StaticResource MenuItemToolbar}">
<MenuItem.Icon>
<Image Source="/Assets/languages.png"/>
</MenuItem.Icon>
<MenuItem.ToolTip>
<ToolTip Content="{Binding Loc[Lng_TT]}"/>
</MenuItem.ToolTip>
</MenuItem>
誰能給我一個建議,如何處理它以填充集合中的選單項并能夠捕獲已檢查的事件?
提前致謝
吉里
uj5u.com熱心網友回復:
您可以將此選單與以下視圖模型一起使用,以獲得所需的功能。
<Menu>
<MenuItem Header="File"/>
<MenuItem Header="Settings">
<MenuItem Header="Application"/>
<MenuItem Header="Language" ItemsSource="{Binding Languages}">
<MenuItem.ItemContainerStyle>
<Style>
<Setter Property="MenuItem.IsCheckable" Value="True"/>
<Setter Property="MenuItem.Header" Value="{Binding Header, Mode=OneWay}"/>
<Setter Property="MenuItem.IsChecked" Value="{Binding IsSelected, Mode=OneWay}"/>
<Setter Property="MenuItem.Command" Value="{Binding DataContext.SelectLanguageCommand, RelativeSource={RelativeSource AncestorType=MenuItem}}"/>
<Setter Property="MenuItem.CommandParameter" Value="{Binding}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</MenuItem>
</Menu>
我使用 CommunityToolkit.Mvvm 庫在這里給你一些想法。您可以使用其他庫。
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
namespace WpfApp1.ViewModel
{
public class MainWindowViewModel : ObservableObject
{
private ObservableCollection<Language> _languages = new();
public ObservableCollection<Language> Languages
{
get => _languages;
set => SetProperty(ref _languages, value);
}
public IRelayCommand SelectLanguageCommand { get; }
public MainWindowViewModel()
{
Languages.Add(new Language { Header = "CZ", IsSelected = false });
Languages.Add(new Language { Header = "EN", IsSelected = true });
SelectLanguageCommand = new RelayCommand<Language>(l =>
{
if (l != null)
{
foreach (Language item in Languages)
{
item.IsSelected = false;
}
l.IsSelected = true;
}
});
}
}
public class Language : ObservableObject
{
private string? _header;
public string? Header
{
get => _header;
set => SetProperty(ref _header, value);
}
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set => SetProperty(ref _isSelected, value);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513329.html
上一篇:異步函式按順序運行WPF
下一篇:文本框樣式設定器中斷功能
