📜  触发复选框组合框 wpf (1)

📅  最后修改于: 2023-12-03 15:11:58.141000             🧑  作者: Mango

触发复选框组合框 WPF

在 WPF 中,复选框和组合框是常用的控件。复选框用于选择多个选项,组合框用于在下拉列表中选择一个选项。我们在实际应用中,可能需要根据用户选择的复选框信息,动态更新组合框中的选项,或者根据组合框中选中的选项,在复选框中勾选或取消勾选某些选项。

修改组合框选项

在 WPF 中,我们可以通过数据绑定的方式,将组合框选项和数据源进行绑定。当数据源发生变化时,组合框中的选项也会自动更新。

首先,在 XAML 中创建组合框,并设置选项绑定的数据源:

<ComboBox ItemsSource="{Binding ComboBoxItems}" SelectedItem="{Binding SelectedComboBoxItem}" />

然后,在 ViewModel 中定义 ComboBoxItems 和 SelectedComboBoxItem 属性,并在构造函数中初始化 ComboBoxItems,如下所示:

public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<string> _comboBoxItems;
    public ObservableCollection<string> ComboBoxItems
    {
        get { return _comboBoxItems; }
        set
        {
            _comboBoxItems = value;
            OnPropertyChanged(nameof(ComboBoxItems));
        }
    }

    private string _selectedComboBoxItem;
    public string SelectedComboBoxItem
    {
        get { return _selectedComboBoxItem; }
        set
        {
            _selectedComboBoxItem = value;
            OnPropertyChanged(nameof(SelectedComboBoxItem));
        }
    }

    public ViewModel()
    {
        // 初始化 ComboBoxItems
        ComboBoxItems = new ObservableCollection<string> { "Option 1", "Option 2", "Option 3" };
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

这样,组合框的选项就和 ViewModel 中的 ComboBoxItems 属性绑定起来了。我们可以在代码中修改 ComboBoxItems 集合,从而动态更新组合框中的选项。

响应复选框事件

要响应复选框事件,我们可以使用 Command,将复选框的 Checked 和 Unchecked 事件绑定到 Command 上。在 Command 的 Execute 方法中,我们可以修改 ViewModel 中的数据,并触发 PropertyChanged 事件通知组合框进行更新。

首先,在 XAML 中创建复选框,并将 Checked 和 Unchecked 事件绑定到 Command 上:

<CheckBox Content="Option 1" IsChecked="{Binding CheckBox1IsChecked}">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Checked">
            <i:InvokeCommandAction Command="{Binding CheckBox1CheckedCommand}" />
        </i:EventTrigger>
        <i:EventTrigger EventName="Unchecked">
            <i:InvokeCommandAction Command="{Binding CheckBox1UncheckedCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
</CheckBox>

然后,在 ViewModel 中定义 CheckBox1IsChecked 属性和 CheckBox1CheckedCommand、CheckBox1UncheckedCommand 命令,如下所示:

public class ViewModel : INotifyPropertyChanged
{
    private bool _checkBox1IsChecked;
    public bool CheckBox1IsChecked
    {
        get { return _checkBox1IsChecked; }
        set
        {
            _checkBox1IsChecked = value;
            OnPropertyChanged(nameof(CheckBox1IsChecked));
        }
    }

    public ICommand CheckBox1CheckedCommand { get; }
    public ICommand CheckBox1UncheckedCommand { get; }

    public ViewModel()
    {
        // 初始化 CheckBox1CheckedCommand 和 CheckBox1UncheckedCommand
        CheckBox1CheckedCommand = new RelayCommand(CheckBox1CheckedExecute);
        CheckBox1UncheckedCommand = new RelayCommand(CheckBox1UncheckedExecute);
    }

    private void CheckBox1CheckedExecute()
    {
        // 复选框 1 被勾选时的逻辑
    }

    private void CheckBox1UncheckedExecute()
    {
        // 复选框 1 被取消勾选时的逻辑
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

这样,我们就可以响应复选框的事件,根据用户的选项来修改 ViewModel 中的数据,从而动态更新组合框中的选项。

组合框和复选框结合

最后,我们可以将组合框和复选框结合起来,根据用户的选择来动态更新组合框中的选项。

首先,在 XAML 中创建多个复选框,并将它们的 IsChecked 属性绑定到 ViewModel 的对应属性上:

<CheckBox Content="Option 1" IsChecked="{Binding CheckBox1IsChecked}" />
<CheckBox Content="Option 2" IsChecked="{Binding CheckBox2IsChecked}" />
<CheckBox Content="Option 3" IsChecked="{Binding CheckBox3IsChecked}" />

然后,在 ViewModel 中根据复选框的选中状态,更新 ComboBoxItems 集合。为了方便起见,我们可以在 ViewModel 中定义一个 UpdateComboBoxItems 方法,用于根据 CheckBox1IsChecked、CheckBox2IsChecked、CheckBox3IsChecked 属性的值,动态更新 ComboBoxItems 集合:

public class ViewModel : INotifyPropertyChanged
{
    private bool _checkBox1IsChecked;
    public bool CheckBox1IsChecked
    {
        get { return _checkBox1IsChecked; }
        set
        {
            _checkBox1IsChecked = value;
            OnPropertyChanged(nameof(CheckBox1IsChecked));
            UpdateComboBoxItems();
        }
    }

    private bool _checkBox2IsChecked;
    public bool CheckBox2IsChecked
    {
        get { return _checkBox2IsChecked; }
        set
        {
            _checkBox2IsChecked = value;
            OnPropertyChanged(nameof(CheckBox2IsChecked));
            UpdateComboBoxItems();
        }
    }

    private bool _checkBox3IsChecked;
    public bool CheckBox3IsChecked
    {
        get { return _checkBox3IsChecked; }
        set
        {
            _checkBox3IsChecked = value;
            OnPropertyChanged(nameof(CheckBox3IsChecked));
            UpdateComboBoxItems();
        }
    }

    private void UpdateComboBoxItems()
    {
        ComboBoxItems.Clear();
        if (CheckBox1IsChecked)
            ComboBoxItems.Add("Option 1");
        if (CheckBox2IsChecked)
            ComboBoxItems.Add("Option 2");
        if (CheckBox3IsChecked)
            ComboBoxItems.Add("Option 3");
    }

    // ...
}

这样,在用户选择复选框的过程中,组合框中的选项就会根据复选框的选中状态而动态更新。

总结

在 WPF 中,复选框和组合框是常用的控件。我们可以通过数据绑定、Command 和 PropertyChanged 事件,来实现动态更新组合框中的选项,并根据用户的选择来动态更新组合框中的选项。