2状态单击 - 列表框项WPF

时间:2011-11-10 14:25:48

标签: wpf listbox click

我有一个ListboxItem,其模板中有一个复选框。当我单击该复选框时,模板的一部分变得可见。这没问题。

我试图通过单击项目本身来模拟相同的行为,使其展开/折叠相应的部分。它应该总是否定项目的当前状态(展开/折叠)

我正在使用C#/ WPF

<Grid x:Name="gridExpanded"
      HorizontalAlignment="Stretch"
      Margin="8"
      Grid.RowSpan="1"
      Width="Auto"
      Height="Auto"
      Visibility="{Binding IsChecked, Converter={StaticResource booleanToVisibilityConverter}, ElementName=checkBox}" />

2 个答案:

答案 0 :(得分:1)

听起来你实际上在寻找Expander控件。这允许您指定标题和内容,单击标题将切换内容的可见性

答案 1 :(得分:0)

通过WPF ListBox在单击相应标签时不会更改CheckBox状态。

要解决这个问题,

1)将 IsVisibleFlag 属性添加到项目模型

2)为项目

的PreviewMouseLeftButtonDown事件添加处理程序

3)在处理程序中使用ItemContainerGenerator.ContainerFromItem更新点击的可见性标志

4)将模板部分的可见性与IsVisibleFlag(或使用checkBox状态)相关联。

ItemModel:

publibc class MyItemModel : INotifyPropertyChanged
{
    private bool _isVisibleFlag;
    public bool IsVisibleFlag
    {
        get { return _isVisibleFlag; }
        set
        {
            if (_isVisibleFlag != value)
            {
                _isVisibleFlag = value;
                OnPropertyChanged(() => IsVisibleFlag);
            }
        }
    }
    // ItemText property goes here (I ommited it to save space)
}

在XAML中:

<Window
        <!--generated x:Class and xmlns goes here (I ommited them to save space) -->
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
    >
    <Window.Resources>
            <Style TargetType="ListBoxItem">
                    <EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />
                    <Setter Property="Template">
                            <Setter.Value>
                                    <ControlTemplate TargetType="ListBoxItem">
                                            <Grid>
                                                    <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="Auto" />
                                                            <ColumnDefinition Width="*" />
                                                    </Grid.ColumnDefinitions>
                                                    <CheckBox Name="chkVisible" Grid.Column="0" IsChecked="{Binding IsVisibleFlag}" />
                                                    <TextBlock Grid.Column="1" Text="{Binding ItemText}" />
                                            </Grid>
                                    </ControlTemplate>
                            </Setter.Value>
                     </Setter>
            </Style>
    </Window.Resources>
    <Grid>
        <ListBox Name="MyListBox" ItemsSource="{Binding AddableWidgets}" />
    </Grid>
</Window>    

在代码中:

    private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        for (int i = 0; i < MyListBox.Items.Count; i++)
        {
            object yourObject = MyListBox.Items[i];
            ListBoxItem lbi = (ListBoxItem)MyListBox.ItemContainerGenerator.ContainerFromItem(yourObject);
            if (lbi.IsFocused)
            {
                MyItemModel w = (MyItemModel)MyListBox.Items[i];
                w.IsVisibleFlag = !w.IsVisibleFlag;
                e.Handled = true;
            }
        }
    }