【问题标题】:Make a list/array of WPF controls in C#?在 C# 中制作 WPF 控件的列表/数组?
【发布时间】:2018-02-23 18:34:02
【问题描述】:

所以,我希望标题是不言自明的,但与往常一样,会更好地描述它。 我正在尝试将 很多 个复选框放入一个列表中,这样当我选中另一个复选框时,我可以使用它们的索引取消选中它们。

我的 XAML 的一个简短部分,因为它有点长且大部分重复

<Expander Header="Tercer Ciclo" FontWeight="Bold" Width="auto" Height="auto">
                <StackPanel>
                    <Expander Header="9° Grado" Margin="20,0,0,0">
                        <StackPanel>
                            <CheckBox x:Name="NovA" Margin="40,0,0,0" Content="Noveno A" />
                            <CheckBox x:Name="NovB" Margin="40,0,0,0" Content="Noveno B" />
                            <CheckBox x:Name="NovC" Margin="40,0,0,0" Content="Noveno C"/>
                            <CheckBox x:Name="NovD" Margin="40,0,0,0" Content="Noveno D"/>
                            <CheckBox x:Name="NovE" Margin="40,0,0,0" Content="Noveno E"/>
                        </StackPanel>
                    </Expander>

这个结构又重复了 7 次左右。问题是,当我选择一个时,我希望其他的取消选中。它并不会真正影响程序的正确运行,它只是更美观并为用户定位。

在你开始大喊我应该使用那个或这个之前。我试过了:

  • 使用单选按钮,但由于它是另一个列表中的列表,所以效果不太好。
  • 我搜索了如何创建一个列表来插入窗口的控件,并找到了一个答案,但它适用于 WinForms,我不知道如何在 WPF 上执行此操作,因为它有不同的方法。
  • 试图手动插入 CheckBox 的名称,一个一个...我没完成;即便如此,控件的 foreach 语法...

我将此作为后面代码的参考: [Assign checkboxes to an checkbox-array using a for loop in C#]

我已经有了,我看到的代码几乎正是我想要的,但同样适用于 WinForms,因此 foreach 语法类型不适合 WPF

private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        List<CheckBox> listCheck = new List<CheckBox>();
        foreach (Control checkbox in //Invoke the window's Controls, don't know the syntaxis)
        {
           //Add the Checkbox's x:Name on the list...


        }
    }

很抱歉,如果我发了这么长的帖子,但我已经为此绞尽脑汁好几个星期了,还没有找到任何线索来说明我错过了什么…… 总的来说,我对 WPF 和 C# 还很陌生,所以是的,有点迷路了。

【问题讨论】:

标签: c# wpf xaml checkbox


【解决方案1】:

您应该从创建一个包含以下内容的数据对象开始:

  • 所有可用项目的列表
  • 所选项目的属性

一旦你有了它,你可以将它绑定到一个用于显示项目列表的控件,并处理一个被选中的项目。 ItemsControl 非常适合显示项目,但不跟踪所选项目。 ListBox 既显示项目列表,又跟踪所选项目,所以我在这里推荐。

这是我过去使用 CheckBoxes 在 ListBox 中显示项目的示例样式:

<Style x:Key="CheckBoxListBoxStyle" TargetType="{x:Type ListBox}">
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="KeyboardNavigation.DirectionalNavigation" Value="Cycle" />
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="{x:Type ListBoxItem}" >
                <Setter Property="Margin" Value="2, 2, 2, 0" />
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border Background="Transparent">
                                <CheckBox IsHitTestVisible="False" Focusable="false" 
                                    Content="{TemplateBinding ContentPresenter.Content}"  
                                    IsChecked="{Binding Path=IsSelected,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay}"/>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

因为ListBoxItem.IsSelected 绑定到CheckBox.IsChecked,所以第二次选择不同的项目它将取消选中其他所有内容,因为所有其他记录上的IsSelected=False

这是用于实际显示控件的ListBox XAML:

<ListBox ItemsSource="{Binding ListOfAllItems}"
         Style="{StaticResource CheckBoxListBoxStyle}"
         SelectedItem="{Binding SelectedItem, Mode=TwoWay}">

请注意,ListBox 后面的.DataContext 应该是您创建的具有项目列表和选定项目的任何对象。如果您不清楚在 WPF 中如何使用 DataContext,我建议您从这里开始:What is DataContext for?

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多