0

我有一个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>

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

<!--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.

预先感谢您的提示。

4

2 回答 2

1

不幸的是,WPF 没有 if/then/else 结构。您必须建立一个工作区或使用框架,这可以解决您的问题。一种可能的解决方案是使用 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 并附加和 IValueConverter,后者根据逻辑提取可见性。

使用 ListBox 的 SelectionChanged 事件也可以,但变得非常不可读并且可能是多余的。如果您遵循 MVVM 方法,那么您后面的代码应该几乎是空的。

于 2013-04-16T12:55:37.557 回答
1

如果您使用的是 MVVM 框架,这将很简单。

如本例所示,将 BooleanToVisibility 转换器添加到您的视图中,使用布尔属性来控制 ViewModel 中每个网格的可见性,只要 ListBox.SelectedItem 更改,这些网格就会更新。

于 2013-04-17T10:13:52.503 回答