我有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.
提前感谢您的提示。
答案 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时,这些网格都会更新。