在WPF - C# - XAML中,在ComboBoxItem(组合框列表)中切换复选框,而不选择项目

tmb3ates  于 2023-11-14  发布在  C#
关注(0)|答案(1)|浏览(121)

我在WPF应用程序中有一个ComboBox,它包含多个ComboBoxItems,每个CheckBox都托管一个CheckBox。我希望用户能够在不实际选择ComboBoxItem的情况下切换CheckBox。目前,如果我单击复选框,它会正确选中复选框,但如果我单击该项目,(而不是复选框)它选择该项目,而不是我只是想使用这个列表来选择复选框,并不希望有任何项目选定。

DEMO -单击复选框时:

x1c 0d1x的数据

DEMO -如果我点击该项目:



正如你所看到的,当我点击该项目,在复选框,然后它检查该项目,但如果我点击该项目,然后选择并显示该项目.我只关心检查项目,不想:
1.当屏幕关闭时是否显示任何项目
1.可以选择任何项目。
XAML代码:

<ComboBox Margin="40,10,0,2" Name="ComboBox1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="250" Height="30" Loaded="ComboBox1_Loaded">
                                        <!-- The items will be added programmatically -->
                                    </ComboBox>

字符串

C#代码隐藏:

private void ComboBox1_Loaded(object sender, RoutedEventArgs e)
        {
            // List of items to be added to the ComboBox
            string[] items = new string[] {
                "Example1", "Example2", "Example3", "Example14", "Example5", 
            };

            foreach (string item in items)
            {
                // Create a new CheckBox
                System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox
                {
                    Content = item,
                    Name = "chk" + item.Replace(" ", "")
                };

                // Create a new ComboBoxItem and add the CheckBox to it
                ComboBoxItem comboBoxItem = new ComboBoxItem();
                comboBoxItem.Content = checkBox;

                // Add the ComboBoxItem to the ComboBox
                ComboBox1.Items.Add(comboBoxItem);
            }
        }

        private void ComboBox1_DropDownClosed(object sender, EventArgs e)
        {
            // StringBuilder to hold all checked items
            var checkedItems = new StringBuilder();

            foreach (ComboBoxItem comboBoxItem in ComboBox1.Items)
            {
                if (comboBoxItem.Content is System.Windows.Controls.CheckBox checkBox && checkBox.IsChecked == true)
                {
                    // Add the checked item to the StringBuilder
                    checkedItems.AppendLine(checkBox.Content.ToString());
                }
            }

            // Check if we have any checked items and write them to debug output
            if (checkedItems.Length > 0)
            {
                Debug.WriteLine("Checked Items:");
                Debug.WriteLine(checkedItems.ToString());
            }
        }


希望你能帮我解决这个问题。
最好的,

p4tfgftt

p4tfgftt1#

如果你不需要ComboBox的功能,其他控件如Menu也可以。这里是一个使用CommunityToolkit.Mvvm的示例。

using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;

public partial class MainWindowViewModel : ObservableObject
{
    public ObservableCollection<ItemViewModel> Items { get; } = new();

    public MainWindowViewModel()
    {
        // Populate Items.
    }
}

public partial class ItemViewModel : ObservableObject
{
    [ObservableProperty]
    string _name;

    [ObservableProperty]
    bool _isSelected;

    public ItemViewModel(string name) => this.Name = name;
}
<Menu>
    <MenuItem Header="Transportation"
              ItemsSource="{Binding Items}">
        <MenuItem.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="OverridesDefaultStyle" Value="True"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type MenuItem}">
                            <CheckBox Content="{Binding Name, Mode=OneTime}"
                                      IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </MenuItem.ItemContainerStyle>
    </MenuItem>
</Menu>

您可以通过迭代ObservableCollection来检查是否检查了每个项。

相关问题