2 состояния click - элемент списка WPF - PullRequest
1 голос
/ 10 ноября 2011

У меня есть 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 ]

1 голос
/ 10 ноября 2011

Звучит так, будто вы действительно ищете элемент управления Expander. Это позволяет вам указать заголовок и контент, а нажатие на заголовок переключит видимость контента

0 голосов
/ 10 августа 2015

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;
            }
        }
    }
...