2014-03-12 84 views
1

我有一个列表框,我想要做的就是折叠基于我SelectedItem的布尔属性的listboxitem。 我的客户端模型上的IsVisible属性实现NotifyPropertyChanged事件。WPF ListBox项目崩溃datatrigger不工作

概述 - 我有一个用户可以在其上执行CRUD的客户列表。当他们删除时,我在模型上设置了一个布尔属性,我的虚拟机暴露给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或类似的东西,但我只是不能隐藏的项目。

任何帮助正确的方向将是伟大的,欢呼声。

编辑

我已经试过布拉姆的建议如下这样的,但仍无法掩饰的项目:

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

+0

我们通常不会在使用MVVM时处理'Click'事件,而宁愿在视图模型中使用'ICommand's。我们在删除UI元素时也不会隐藏UI元素,而是从视图模型中的集合中删除它们。 – Sheridan

+0

我同意,这就是为什么我提到Click事件是一个jippo来模拟我的虚拟机中调用的命令。纯粹用于测试。 – ceebreenk

回答

0

这是相当令人沮丧,而且该解决方案那么简单使用它。我的客户模型与IsVisible是在一个DLL和NotifyPropertyChanged()的变化从来没有建立更新我的项目中的参考..因此,绑定从未发生过。这些深夜正在收费。

0

您将需要设立一个转换器,如果你是返回真/假,但有一个系统转换器

将其上移到资源
我知道我有这样

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

Blam,谢谢你,但我仍然无法隐藏/折叠物品。我编辑了我的问题以显示我做了什么。 – ceebreenk

+1

不知道该说些什么。这对我有用。尝试一个硬编码折叠 - 它可能是一个绑定或转换器的问题。 – Paparazzi