Триггер данных свертывания элемента списка WPF ListBox не работает

У меня есть список, и все, что я хочу сделать, это свернуть элемент списка на основе логического свойства моего SelectedItem. Свойство IsVisible в моей клиентской модели реализует событие NotifyPropertyChanged.

Обзор. У меня есть список клиентов, на которых пользователи могут выполнять CRUD. Когда они удаляются, я устанавливаю логическое свойство в модели, которую моя виртуальная машина предоставляет представлению. Затем это должно скрыть только «удаленную» строку из списка. Во время сброса в БД я CRUD на основе режима модели.

<ListBox Name="listClients"
                 Grid.Column="1" Grid.Row="1" 
                 Margin="0" BorderThickness="0"                     
                 Height="auto"
                 Style="{StaticResource BumListBox}"
                 SelectionMode="Extended"
                 ItemsSource="{Binding Path=ClientList}"
                 SelectedItem="{Binding SelectedClient, Mode=TwoWay}"
                 Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" >

            <ListBox.ItemContainerStyle>
                <Style TargetType="{x:Type ListBoxItem}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsVisible}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.ItemContainerStyle>

            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="50"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" Text="{Binding ClientNo}" Foreground="White" FontSize="{StaticResource HeaderFontSize}" VerticalAlignment="Center" />
                        <TextBlock Grid.Column="1" Text="{Binding ClientDesc}" Foreground="White" FontSize="{StaticResource SubHeaderFontSize}" FontWeight="Light" VerticalAlignment="Center" />                           
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Код для процесса jippo MVVM:

private void Button_Click_1(object sender, RoutedEventArgs e)
{
    if (_cvm.SelectedClient != null)
    {
        _cvm.SelectedClient.IsVisible = !_cvm.SelectedClient.IsVisible;
        _cvm.CurrentSelectedIsVisible = _cvm.SelectedClient.IsVisible;  //<- another       option to bind to
    }
}

Я попробовал эти предложения здесь и здесь или что-то подобное, но я просто не могу скрыть элементы.

Любая помощь в правильном направлении будет здорово, ура.

Изменить

Я попробовал предложение Блама ниже, но все еще не смог скрыть элементы:

<ListBox.Resources>
<Style TargetType="ListBoxItem">
    <Setter Property="Visibility" Value="{Binding Path=CurrentIsVisible, Converter={StaticResource b2v}}" />
</Style>


person ceebreenk    schedule 12.03.2014    source источник
comment
Обычно мы не обрабатываем события Click при использовании MVVM, вместо этого предпочитая использовать ICommand в модели представления. Мы также не скрываем элементы пользовательского интерфейса при их удалении, а удаляем их из коллекций в модели представления.   -  person Sheridan    schedule 13.03.2014
comment
Я согласен, поэтому я упоминаю, что событие Click - это jippo для имитации команды, вызываемой в моей виртуальной машине. Чисто для теста.   -  person ceebreenk    schedule 13.03.2014


Ответы (2)


Вам нужно будет настроить преобразователь, если вы возвращаете true/false, но для этого есть системный преобразователь

Переместите его в Ресурсы
Я знаю, что использовал его таким образом

<ListBox x:Name="lb" ItemsSource="{Binding}" DisplayMemberPath="Text">
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Setter Property="Visibility" Value="{Binding Path=Vis}" />
        </Style>
    </ListBox.Resources>
</ListBox>
person paparazzo    schedule 12.03.2014
comment
Блам, спасибо за это, но я все еще не могу скрыть/свернуть элемент. Я отредактировал свой вопрос, чтобы показать, что я сделал. - person ceebreenk; 13.03.2014
comment
Не знаю, что сказать. Это работает для меня. Попробуйте жестко закодировать Collapsed - это может быть проблема с привязкой или конвертером. - person paparazzo; 13.03.2014

Это было довольно неприятно, и решение было таким простым. Моя клиентская модель с IsVisible находится в dll, и изменения NotifyPropertyChanged() никогда не создавались для обновления ссылки в моем проекте, поэтому привязка никогда не происходила. Эти поздние ночи берут свое.

person ceebreenk    schedule 13.03.2014