WPF ListBox项目折叠datatrigger无法正常工作

时间:2014-03-12 21:07:02

标签: wpf xaml mvvm listboxitem

我有一个列表框,我想要做的就是根据my SelectedItem的布尔属性折叠listboxitem。 我的客户端Model上的IsVisible属性实现了NotifyPropertyChanged事件。

概述 - 我有一个用户列表,用户可以在其上执行CRUD。当他们删除时,我在模型上设置了一个布尔属性,我的VM暴露给View。这应该只隐藏列表中的“已删除”行。在基于模型模式刷新到db I 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
    }
}

我已尝试过这些建议herehere或类似的内容,但我无法隐藏这些内容。

任何正确方向的帮助都会很棒,欢呼。

修改

我在下面尝试过Blam的建议,但仍然无法隐藏这些项目:

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

2 个答案:

答案 0 :(得分:0)

如果您返回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>

答案 1 :(得分:0)

这非常令人沮丧,解决方案如此简单。我的带有IsVisible的客户端模型是一个dll,并且从未构建NotifyPropertyChanged()更改以更新我的项目中的引用。所以绑定从未发生过。这些深夜正在造成损失。