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 中处理根 Grid
的 Loaded
事件@ 以编程方式:
<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:设置第一项的前景色的主要内容,如果未能解决你的问题,请参考以下文章