WPF Listbox Item:设置第一项的前景色

Posted

技术标签:

【中文标题】WPF Listbox Item:设置第一项的前景色【英文标题】:WPF Listbox Item: Set forecolor of first item 【发布时间】:2018-06-24 13:26:13 【问题描述】:

我有一个绑定到一个类的 WPF ListBox。如下

   public class MyClass
   
     public string Name get; set; 
     public string Gender get; set; 
   

  ObservableCollection<MyClass> myData= new ObservableCollection<MyTable>();
  myClassList.ItemsSource = myData;

我的 XAML 为:

  <DataTemplate x:Key="userData">
    <Grid HorizontalAlignment="Stretch" Margin="3,0,3,0" Height="60">
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>

      <wpfgeneralcontrols:TextControl Grid.Column="0" Grid.Row="0" Text="Binding Path=Name" Style="StaticResource SmallTextControlStyle"
                 TextAlignment="Left" Margin="0"/>

      <wpfgeneralcontrols:TextControl Grid.Column="1" Grid.Row="0" Text="Binding Path=Gender" Style="StaticResource SmallTextControlStyle"
                 TextAlignment="Left" Margin="0"/>
    </Grid>
  </DataTemplate>


  <ListView Name="PatientsList" Background="Transparent"  BorderThickness="0"
           Width="700" HorizontalAlignment="Center"
           ItemTemplate="StaticResource userData"
           ScrollViewer.VerticalScrollBarVisibility ="Visible" />

如何设置ListBox的第一项(不是选中项)的前景色?我已经看到了一些解决此问题的想法,但无法将其调整为设置列表框中第一项的前景色。

【问题讨论】:

【参考方案1】:

您不能在纯 XAML 中执行此操作 - XAML 是一种 标记 语言而不是编程语言 - 但您可以在 @987654323 中处理根 GridLoaded 事件@ 以编程方式:

<DataTemplate x:Key="userData">
    <Grid HorizontalAlignment="Stretch" Margin="3,0,3,0" Height="60"
          Loaded="Grid_Loaded">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <TextBlock Grid.Column="0" Grid.Row="0" Text="Binding Path=Name"
                   TextAlignment="Left" Margin="0"/>

        <TextBlock Grid.Column="1" Grid.Row="0" Text="Binding Path=Gender"
                   TextAlignment="Left" Margin="0"/>
    </Grid>
</DataTemplate>

int n = 0;
private void Grid_Loaded(object sender, RoutedEventArgs e)

    if (n++ == 0)
    
        Grid grid = sender as Grid;
        foreach (var tb in grid.Children.OfType<TextBlock>())
            tb.Foreground = System.Windows.Media.Brushes.Red;
        grid.Loaded -= Grid_Loaded;
    

我假设您的自定义 TextControl 具有 Foreground 属性。在上面的示例代码中我使用了TextBlocks

这不会破坏 MVVM 模式。在视图所属的视图中实现视图相关的逻辑是非常好的。

【讨论】:

我试过了,但出现错误:无法将“System.Drawing.Brush”隐式转换为“System.Windows.Media.Brush”。尝试进行转换,但没有成功 那么你为什么要使用 System.Drawing.Brush?你的 TextControl 的属性是什么类型的? 检查我的编辑。如果您出于某种原因使用 WinForms 画笔,只需将“System.Windows.Media”替换为“System.Drawing”即可。 您提供的更新现在可以正常工作。我还用我的自定义 TextControl 替换了 TextBlock。完美的解决方案!【参考方案2】:

如果您的项目不为空,您可以使用PreviousData 检测第一个项目。

<DataTemplate x:Key="userData">
    <TextBlock Text="Binding Path=Name"/>
</DataTemplate>

<ListView ItemTemplate="StaticResource userData" ItemsSource="Binding MyItems">
    <ListView.ItemContainerStyle>
        <Style TargetType="x:Type ListViewItem">
            <Style.Triggers>
                <DataTrigger Binding="Binding RelativeSource=RelativeSource PreviousData" Value="x:Null">
                    <Setter Property="Background" Value="Red" />
               </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

【讨论】:

我尝试了您的建议,但不幸的是它没有奏效。

以上是关于WPF Listbox Item:设置第一项的前景色的主要内容,如果未能解决你的问题,请参考以下文章

加载 WPF 时在 ListBox 中设置选定项的样式

WPF中 listbox中item被选中时的样式

根据 ListBox 中的索引设置 ListBoxItem 的样式

WPF的listbox可否做到首尾两项相连

如何更改组合框PyQt4中第一项的字体大小

用wpf或者blend怎么修改listbox被选中项的颜色