【发布时间】: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
}
}
我已经尝试了这些建议 here 和 here 或类似的东西,但我就是无法隐藏这些项目。
任何对正确方向的帮助都会很棒,干杯。
编辑
我在下面尝试过 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