【问题标题】:Adding checkboxes to wpf listbox for multiple selection将复选框添加到 wpf 列表框以进行多选
【发布时间】:2011-02-25 16:48:34
【问题描述】:
  <StackPanel Grid.Column="0" >
            <Button Name="buttonEditListBoxItem" Content="Edit" Click="buttonEditListBoxItem_Click"></Button>
            <ListBox  Name="ListBoxTriggers" 
                 SelectedValuePath="TriggerId" 
                 IsSynchronizedWithCurrentItem="True"
                 SelectionChanged="Triggers_SelectionChanged"
                 ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                 HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate><Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="AUTO"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <CheckBox Grid.Column="0" VerticalAlignment="Center" x:Name="checkBoxTriggers" ></CheckBox>
                            <Button Grid.Column="1" Style="{StaticResource GlassButton}" 
                            Uid="{Binding Path=TriggerId}" 
                            Margin="5"
                           x:Name="ButtonTrigger"
                           GotFocus="ButtonTrigger_GotFocus"
                          >
                                <Button.Content>
                                    <TextBlock Foreground="White" TextAlignment="Justify"
                                       TextWrapping="Wrap" Margin="6"   Text="{Binding Path=Name}"/>
                                </Button.Content>
                            </Button>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate></ListBox>

            </StackPanel>

我想创建一个带有数据模板的列表框,其中包括一个按钮和一个复选框。我想要做的是当我点击编辑按钮时,这些复选框应该变得可见,当我再次点击它时,我想让这些复选框不可见/折叠

Answer:我现在把代码改成这样了:`

</Window.Resources>  <StackPanel Grid.Column="0" >
            <ToggleButton Name="buttonEditListBoxItem" 
                          Content="Edit" 
                          IsChecked="False"
                          Click="buttonEditListBoxItem_Click"></ToggleButton>
            <ListBox  Name="ListBoxTriggers" 
                 SelectedValuePath="TriggerId" 
                 IsSynchronizedWithCurrentItem="True"
                 SelectionChanged="Triggers_SelectionChanged"
                 ScrollViewer.HorizontalScrollBarVisibility="Auto" 
                 HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate>  <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="AUTO"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <CheckBox Visibility="{Binding ElementName=buttonEditListBoxItem, Path=IsChecked, Converter={StaticResource visibilityConverter}}" Grid.Column="0" VerticalAlignment="Center" x:Name="checkBoxTriggers" ></CheckBox>
                            <Button Grid.Column="1" Style="{StaticResource GlassButton}" 
                            Uid="{Binding Path=TriggerId}" 
                            Margin="5"
                           x:Name="ButtonTrigger"
                           GotFocus="ButtonTrigger_GotFocus"
                          >
                                <Button.Content>
                                    <TextBlock Foreground="White" TextAlignment="Justify"
                                       TextWrapping="Wrap" Margin="6"   Text="{Binding Path=Name}"/>
                                </Button.Content>
                            </Button>
                        </Grid>
                    </DataTemplate> </ListBox.ItemTemplate>
        </ListBox>` `public class VisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((Boolean)value) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return (((Visibility)value) == Visibility.Visible);
    }
}`

【问题讨论】:

    标签: c# wpf datatemplate listboxitem


    【解决方案1】:

    最简单的方法是使用切换按钮

    示例:

    <ToggleButton  Name="Toggler">
    </ToggleButton>
    <StackPanel Visibility="{Binding ElementName=Toggler, Path=Checked, Converter={StaticResource booleanToVisibilityConverter}}">
    <!-- in here you can place the checkboxes-->
    </StackPanel>
    

    你只需要创建一个 valueconverter 将 boolean 转换为 enumeration Visibility

    另一种可能性是将“弹出”元素与切换按钮结合使用(给人一种小帮手的感觉,弹出来编辑项目,如果设置了 StaysOpen="False" 则在失去焦点时立即关闭) 如果您使用这种方法,您不必重新按下编辑按钮来隐藏复选框

    【讨论】:

    • 感谢您的回答。我添加了一个 ToggleButton 并将其 IsChecked 属性用于可见性转换器来决定复选框的可见性。
    • 想问一个后续问题....如果我必须将其用作控件并使用 buttonEditListBoxItem.isVisible=false 之类的属性....我是否将其转换为用户控件/自定义控制,以便我可以在任何窗口中使用它
    【解决方案2】:

    如何使用ToggleButton 而不是ButtonVisibilityConverter

    <ListBox  Name="ListBoxTriggers"
                SelectedValuePath="TriggerId"
                IsSynchronizedWithCurrentItem="True"
                SelectionChanged="Triggers_SelectionChanged"
                ScrollViewer.HorizontalScrollBarVisibility="Auto"
                HorizontalContentAlignment="Stretch">
        <ListBox.Resources>
            <local:VisibilityConverter x:Key="VisibilityConverter" />
        </ListBox.Resources>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="AUTO" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <CheckBox Grid.Column="0"
                                VerticalAlignment="Center"
                                x:Name="checkBoxTriggers"
                                Visibility="{Binding ElementName=ButtonTrigger, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"></CheckBox>
                    <ToggleButton Grid.Column="1"
                                    Uid="{Binding Path=TriggerId}"
                                    Margin="5"
                                    x:Name="ButtonTrigger"
                                    GotFocus="ButtonTrigger_GotFocus">
                        <ToggleButton.Content>
                            <TextBlock Foreground="White"
                                        TextAlignment="Justify"
                                        TextWrapping="Wrap"
                                        Margin="6"
                                        Text="{Binding Path=Name}" />
                        </ToggleButton.Content>
                    </ToggleButton>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    

    可见性转换器:

    public class VisibilityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return ((Boolean)value) ? Visibility.Visible : Visibility.Collapsed;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (((Visibility)value) == Visibility.Visible);
        }
    }
    

    【讨论】:

    • 感谢您的回答。我添加了一个 ToggleButton 并将其 IsChecked 属性用于可见性转换器来决定复选框的可见性。
    • 我不希望模板内的按钮决定我的复选框的可见性。列表框外有一个编辑按钮,我想根据它来决定。谢谢,虽然你的回答确实有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多