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 構造がありません。問題を解決できる回避策を構築するか、フレームワークを使用する必要があります。考えられる解決策の 1 つは、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も必要です。

もう 1 つの解決策は、DataGrid の可視性を SelectedItem.AccountNumber に直接バインドし、ロジックに従って可視性を抽出する IValueConverter をアタッチすることです。

ListBox の SelectionChanged イベントを使用することもできますが、ほとんど判読できなくなり、冗長になる可能性があります。MVVM アプローチに従う場合、コード ビハインドはほとんど空になります。

于 2013-04-16T12:55:37.557 に答える