【问题标题】:WPF ListBox Item collapse datatrigger not workingWPF ListBox 项折叠数据触发器不起作用
【发布时间】:2014-04-17 07:32:57
【问题描述】:

我有一个列表框,我想做的就是根据我的 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
    }
}

我已经尝试了这些建议 herehere 或类似的东西,但我就是无法隐藏这些项目。

任何对正确方向的帮助都会很棒,干杯。

编辑

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

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

【问题讨论】:

  • 我们在使用 MVVM 时通常不处理 Click 事件,而是更喜欢在视图模型中使用 ICommands。我们也不会在删除 UI 元素时隐藏它们,而是将它们从视图模型的集合中移除。
  • 我同意,这就是为什么我提到 Click 事件是一个 jippo 来模拟在我的 VM 中调用的命令。纯粹用于测试。

标签: wpf xaml mvvm listboxitem


【解决方案1】:

这很令人沮丧,而且解决方案如此简单。我的带有 IsVisible 的客户端模型位于 dll 中,并且从未构建 NotifyPropertyChanged() 更改来更新我的项目中的引用。所以绑定从未发生。这些深夜正在付出代价。

【讨论】:

    【解决方案2】:

    如果您返回真/假,则需要设置一个转换器,但有一个系统转换器用于此

    将其移至资源
    我知道我用过这种方式

    <ListBox x:Name="lb" ItemsSource="{Binding}" DisplayMemberPath="Text">
        <ListBox.Resources>
            <Style TargetType="ListBoxItem">
                <Setter Property="Visibility" Value="{Binding Path=Vis}" />
            </Style>
        </ListBox.Resources>
    </ListBox>
    

    【讨论】:

    • Blam,谢谢,但我仍然无法隐藏/折叠该项目。我已经编辑了我的问题以显示我做了什么。
    • 不知道该说什么。这对我有用。尝试硬编码 Collapsed - 它可能是绑定或转换器问题。
    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 2012-09-13
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2013-01-05
    • 2013-06-25
    相关资源
    最近更新 更多