【问题标题】:Show tick image when item is selected in WPF Listbox在 WPF 列表框中选择项目时显示刻度图像
【发布时间】:2013-03-09 17:01:22
【问题描述】:

我有一个简单的 ListBox,它显示水平和垂直的图像列表。 我还在每个图像上添加了一个刻度图像。现在我想仅在列表框中选择项目时启用此刻度图像。

我怎样才能做到这一点?

列表框 XAML:

    <ListBox x:Name="PhotoCollection"
         Grid.Row="2"
         Grid.ColumnSpan="4"
         ItemsSource="{Binding PhotoCollection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         SelectionMode="Multiple">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Vertical">
        <Border BorderBrush="White"
                BorderThickness="2"
                Margin="5"
                Background="LightGray">
          <Grid>
          <Image Source="{Binding}"
                 Stretch="Uniform"
                 Width="50"
                 Height="50"
                 Margin="5" />
            <Image Source="{StaticResource Check_24}"
                   Visibility="{Binding Converter={StaticResource VisibleConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1},Path=IsSelected}"
                   Stretch="Uniform"
                   Width="20"
                   Height="20"
                   Margin="5" 
                   HorizontalAlignment="Right"
                   VerticalAlignment="Bottom"/>
          </Grid>
        </Border>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <WrapPanel IsItemsHost="True"
                 Orientation="Horizontal" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
</ListBox>

编辑:这一行可以解决问题

Visibility="{Binding Converter={StaticResource VisibleConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1},Path=IsSelected}"

【问题讨论】:

  • @Joulukuusi。我知道我需要将厚图像的可见性绑定到 Listbox 项的 IsSelected 状态,但我看不到如何在我的 XAML 中执行此操作。

标签: wpf image listbox


【解决方案1】:

当您将ListBoxItemIsSelected 属性绑定到您的属性IsVisible 时,它应该可以工作。但这取决于您如何实现 ViewModel 和属性。

<ListBox>
  <!-- the rest of the XAML-Definition of your ListBox -->
  <ListBox.ItemContainerStyle>
    <Style TargetType="ListBoxItem">
      <Setter Property="IsSelected" Value="{Binding IsVisible, Mode=TwoWay}"/>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>

【讨论】:

  • 我想你误解了我,或者我是你 :) 我只需要在我选择列表框中的项目时才能看到刻度图像。如果未选择该项目,则刻度图像不应该是可见的。只有示例图像中的 4 个选定项目(请参阅开始帖子)应该有刻度线。您会将您的 xaml 添加到我的 xaml 的什么位置?
  • @PitAttack76 将 Xaml 添加到您的 xaml 的其余部分。您无需转换器即可使其工作。
【解决方案2】:

当我需要将项目的可见性绑定到布尔值时,我一直在使用转换器类:

public class BoolToVisibleOrHidden : IValueConverter {
        public BoolToVisibleOrHidden() { }
        public bool Collapse { get; set; }
        public bool Reverse { get; set; }
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            bool bValue = (bool)value;
            if (bValue != Reverse) {
                return Visibility.Visible;
            } else {
                if (Collapse)
                    return Visibility.Collapsed;
                else
                    return Visibility.Hidden;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
            Visibility visibility = (Visibility)value;
            if (visibility == Visibility.Visible)
                return !Reverse;
            else
                return Reverse;
        }
    }

像这样在 XAML 中获取它的实例后:

<local:BoolToVisibleOrHidden x:Key="BoolToVisConverter" Collapse="True" />

我可以像这样绑定项目的可见性:

Visibility="{Binding Converter={StaticResource BoolToVisConverter}, Path=DataContext.PATHTOBOOLEAN}"

【讨论】:

  • 这里也一样,我应该从哪里获取值“DataContext.PATHTOBOOLEAN”?如何将它引用到 ListboxItem 的状态?
  • @PitAttack76 试试 DataContext.IsSelected 。这可能会返回列表项的 selected 属性。查看输出窗口中的数据绑定错误消息,以确定这是否正确。
  • 现在我已经创建了转换器并将可见性绑定更改为: Visibility="{Binding Converter={StaticResource VisibleConverter}, Path=DataContext.IsSelected}" 但没有运气。我在输出窗口中没有看到任何错误......该死的。我被困在这里..
  • 找到了!!这有效: Visibility="{Binding Converter={StaticResource VisibleConverter}, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}, AncestorLevel=1},Path=IsSelected}" 感谢您在正确的方向:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
相关资源
最近更新 更多