【发布时间】:2014-02-27 11:33:12
【问题描述】:
此 DataTemplate 用于 ListBox
希望fieldTemplateDetail 仅在ListBoxItem IsSelected 时可见
Visibility="{Binding Path=IsSelected, Converter=bvc}"
以上不是有效的语法,但这就是我想要做的
<DataTemplate x:Key="fieldTemplate">
<Border BorderBrush="Orange" BorderThickness="2" Margin="2" Padding="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Path=Name}" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=DisplayValue}" />
<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
x:Name="fieldTemplateDetail"
Content="{Binding}"
Visibility="{Binding Path=IsSelected, Converter=bvc}"
ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>
</Grid>
</Border>
</DataTemplate>
我还没有看过 III 的答案,但这适用于详细模板
但显然我不想重复的是所有细节控件
<DataTemplate x:Key="fieldStringTemplate">
<StackPanel x:Name="fieldString" Visibility="Collapsed">
<TextBox Text="{Binding Path=FieldValue}" />
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType={x:Type ListBoxItem}},
Path=IsSelected}"
Value="True">
<Setter TargetName="fieldString" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
III 的答案是抛出错误
可见性
TypeConverter IValueConverter 不支持从字符串转换
<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
x:Name="fieldTemplateDetail"
Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},
Path=IsSelected, Converter=bvc}"
Content="{Binding}"
ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>
这似乎有效
<local:FieldTemplateSelector x:Key="fieldTemplateSelector"/>
<DataTemplate x:Key="fieldTemplate">
<Border BorderBrush="Orange" BorderThickness="2" Margin="2" Padding="2">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="60"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Path=Name}" />
<TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=DisplayValue}" />
<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2"
Visibility="Collapsed"
x:Name="fieldTemplateDetail"
Content="{Binding}"
ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>
</Grid>
</Border>
<DataTemplate.Triggers>
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource
Mode=FindAncestor,
AncestorType={x:Type ListBoxItem}},
Path=IsSelected}"
Value="True">
<Setter TargetName="fieldTemplateDetail" Property="Visibility" Value="Visible"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
【问题讨论】:
-
如果 ListBoxItem 不可见,您将如何选择它(假设此 DataTempalte 应用为您的 listBox 的 ItemTempalte)?
-
他想要隐藏的并不是整个 ListBoxItem,如果你仔细看的话,它有 TextBlock for Name 和 DisplayValue 只有他想要隐藏的 ContentPresent。
标签: .net wpf visibility datatemplate