你好,我想在点击确定按钮后选中复选框的值。 下面是代码
<CheckBox x:Name="chkABC" Content="ABC" Grid.Row="1" HorizontalAlignment="Left" Margin="70,0,0,0"/>
<CheckBox x:Name="chkXYZ" Content="XYZ" Grid.Row="2" HorizontalAlignment="Left" Margin="70,0,0,0"/>
<CheckBox x:Name="chkPQR" Content="PQR" Grid.Row="3" HorizontalAlignment="Left" Margin="70,0,0,0"/>
如果用户选择ABC和PQR,然后点击OK按钮,我要ABC和PQR在后端。
您可以在后面的代码中按名称访问元素。 例如chkABC
假设如果有一个按钮单击处理程序,那么您可以检查复选框的IsChecked值,如下所示
if(chkABC.IsChecked.HasValue && chkABC.IsChecked.Value)
同样,你也可以勾选其他复选框以获得选中的复选框。 有关国家的更多信息,请访问链接
请您更具体地说明您所说的值在这个答案中的含义,我认为您想要的是content
属性
根据您对数据的需求,您可以使用LINQ进行演示我假设这些复选框位于一些名为Grid
的网格中
string[] values = grid.Children
.OfType<CheckBox>()
.Where(cb => (bool)cb.IsChecked)
.Select(cb => cb.Content.ToString())
.ToArray();
这样的办法会管用的
WPF的强大之处在于与控件的交互并不容易,也不酷。 更有效地使用WPF的主要思想是MVVM编程模式和绑定
。 您可以在文档中阅读有关数据绑定的更多信息。
下面是一个基于MVVM的示例
对于TwoWay
与Binding
的交互,我使用InotifyPropertyChanged
接口实现作为在视图模型类中派生它的助手类。
NotifyPropertyChanged.cs
public class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName]string propertyName = null)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
另一个帮助器类实现了简单使用命令所需的ICommand
接口。 它在某种程度上是click
事件处理程序的强大替代,具有更多(甚至没有)功能。
中继命令。cs
public class RelayCommand : ICommand
{
private readonly Action<object> _execute;
private readonly Func<object, bool> _canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter) => _canExecute == null || _canExecute(parameter);
public void Execute(object parameter) => _execute(parameter);
}
MainViewModel
类表示主视图(窗口)中使用的所有属性和命令的位置。 窗口
的DataContext
设置为此类(请参见XAML中的内容)。
MainViewModel.cs
public class MainViewModel : NotifyPropertyChanged
{
private bool _checkedABC;
private bool _checkedXYZ;
private bool _checkedPQR;
private ICommand _myCommand;
public bool CheckedABC
{
get => _checkedABC;
set
{
_checkedABC = value;
OnPropertyChanged(); // notify the UI about the change
}
}
public bool CheckedXYZ
{
get => _checkedXYZ;
set
{
_checkedXYZ = value;
OnPropertyChanged();
}
}
public bool CheckedPQR
{
get => _checkedPQR;
set
{
_checkedPQR = value;
OnPropertyChanged();
}
}
public ICommand MyCommand => _myCommand ?? (_myCommand = new RelayCommand(parameter =>
{
MessageBox.Show("ABC: " + CheckedABC + "\r\n" + "XYZ: " + CheckedXYZ + "\r\n" + "PQR: " + CheckedPQR + "\r\n");
}));
public MainViewModel()
{
}
}
最后是视图标记。
MainWindow.xaml
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Width="300" Height="200">
<Window.DataContext>
<local:MainViewModel/><!-- Here's View Model instantiation. Same as "new MainViewModel()" but in XAML -->
</Window.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackPanel>
<CheckBox Content="ABC" IsChecked="{Binding CheckedABC}" Margin="5"/>
<CheckBox Content="XYZ" IsChecked="{Binding CheckedXYZ}" Margin="5"/>
<CheckBox Content="PQR" IsChecked="{Binding CheckedPQR}" Margin="5"/>
</StackPanel>
<Button Grid.Row="1" Content="Sumbit" Command="{Binding MyCommand}" Margin="5"/>
</Grid>
</Window>
就是这样。
另外一个特性是可以通过编程方式更改checkbox.ischecked
,只需更改一个视图模型属性。 复选框
将自动更新其布局。
CheckedABC = true;
您可以对任何Control
或ItemsControl
使用相同的方法。