【问题标题】:Is Selected Visibility of Element in DataTemplate是 DataTemplate 中元素的选定可见性
【发布时间】: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


【解决方案1】:

更新您对此的绑定

<ContentPresenter Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
                  x:Name="fieldTemplateDetail"
                  Content="{Binding}"
                  Visibility="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem},
                               Path=IsSelected, Converter={StaticResource bvc}}"
                  ContentTemplateSelector="{StaticResource fieldTemplateSelector}"/>

更新:我必须添加 StaticResource 才能找到转换器。

【讨论】:

  • Visisbility TypeConverter 出错 IValueConverter 不支持从字符串转换
  • 来自系统 查看问题。我想我成功了。
  • 哦,哎呀,让我更新一下。我忘了添加 StaticResource,所以你不能只在绑定上使用 cvs,这就是它抛出的原因。这是较短的代码。 :)
  • 那行得通。我的最后一个问题是在未选择样式时应用样式。
猜你喜欢
  • 2016-12-08
  • 1970-01-01
  • 2016-07-12
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
  • 2012-09-30
相关资源
最近更新 更多