提问者:小点点

获取WPF中选中的复选框的值


你好,我想在点击确定按钮后选中复选框的值。 下面是代码

<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在后端。


共3个答案

匿名用户

您可以在后面的代码中按名称访问元素。 例如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的示例

对于TwoWayBinding的交互,我使用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;

您可以对任何ControlItemsControl使用相同的方法。