基于WPF中的Selected ListBoxItem隐藏/显示DataGrid

时间:2013-04-16 11:37:48

标签: wpf datagrid listbox

我有ListBox

<ListBox Name="ListB" SelectedIndex="0" ItemsSource="{Binding Account}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>

                <TextBlock FontSize="16" Grid.Column="0" Grid.RowSpan="3"> 
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} {1}" >
                            <Binding Path="AccountNumber" />
                            <Binding Path="Name" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

基于绑定到ListBoxItems的AccountNumber我想Show/Hide DataGrid's

<!--DataGrid 1-->       
    <DataGrid ItemsSource="{Binding ElementName=ListB, Path=SelectedItem}">
..................
</DataGrid>

 <!--DataGrid 2-->      
    <DataGrid ItemsSource="{Binding ElementName=ListB, Path=SelectedItem}">
..................
</DataGrid>

WPF中是否有if / else?例如

if SelectedItem in ListBox has an AccountNumber 100 
      than show DataGrid 1 and hide DataGrid 2
else hide DataGrid 1 and show DataGrid 2.

提前感谢您的提示。

2 个答案:

答案 0 :(得分:1)

不幸的是,WPF没有if / then / else结构。您必须构建一个work-arround或使用框架,这可以解决您的问题。一种可能的解决方案是使用blend sdk的交互触发框架:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 

您提及的行为将实现如下:

<i:Interaction.Triggers>
   <!-- One Trigger for equal 100 -->
   <ei:DataTrigger Binding="{Binding Path=SelectedItem.AccountNumber,
                                     ElementName=ListB}"
                   Value="100">
      <ei:ChangePropertyAction TargetName="DataGrid1" 
                               PropertyName="Visibility" 
                               Value="Collapsed" />
      <ei:ChangePropertyAction TargetName="DataGrid2" 
                               PropertyName="Visibility" 
                               Value="Visible" />

   </ei:DataTrigger> 

   <!-- One Trigger for not equal 100 -->
   <ei:DataTrigger Binding="{Binding Path=SelectedItem.AccountNumber,
                                     ElementName=ListB}"
                   Comparison="NotEqual"
                   Value="100">
      <ei:ChangePropertyAction TargetName="DataGrid1" 
                               PropertyName="Visibility" 
                               Value="Visible" />
      <ei:ChangePropertyAction TargetName="DataGrid2" 
                               PropertyName="Visibility" 
                               Value="Collapsed" />

   </ei:DataTrigger> 

</i:Interaction.Triggers>

您需要在项目参考中包含 System.Windows.Interactivity.dll 。 还需要 Microsoft.Expression.Interactions.dll

另一个解决方案是将DataGrids的可见性直接绑定到SelectedItem.AccountNumber和attach和IValueConverter,它们根据逻辑提取可见性。

使用ListBox的SelectionChanged事件也可以工作,但变得非常难以理解并且可能是多余的。如果你遵循MVVM方法,你的代码应该几乎是空的。

答案 1 :(得分:1)

如果您使用的是MVVM框架,这将是直截了当的。

this example中为View添加一个BooleanToVisibility转换器,使用布尔属性来控制ViewModel中每个网格的可见性,每当更改ListBox.SelectedItem时,这些网格都会更新。