【发布时间】:2022-01-14 12:04:04
【问题描述】:
我使用 DataTemplate 重复生成我的 ListBox 的内容。 xml代码如下:
<DataTemplate x:Key="singleUnit">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding fileName}" FontSize="20" Foreground="{Binding color}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBlock/>
</StackPanel>
</DataTemplate>
<ListBox Name="MyListBox" Width="300" Height="600">
</ListBox>
而cs代码是:
private void Show()
{
const int TotalCount = 100;
for (int i = 0; i < TotalCount; i++)
{
ContentControl cc = new ContentControl();
cc.ContentTemplate = this.Resources["singleUnit"] as DataTemplate;
DataModel dm = new DataModel();
dm.fileName = "myfile" + i;
dm.color = new SolidColorBrush(Colors.Blue);
cc.Content = dm;
MyListBox.Items.Add(cc);
}
MyListBox.ScrollIntoView(MyListBox.Items[TotalCount / 2]);
}
我希望改变所有项目的颜色:目前每个项目,文件名的前景色是蓝色的。我希望在按下按钮时将其更改为绿色。
这就像用户通过一些选择操作来改变颜色主题。当颜色改变时,所有其他的东西都不应该改变,例如。滚动条的位置。
难点在于我使用模板来生成内容,以及如何对每一项进行迭代和修改。
我将可行的演示代码放在我的 Github 上: https://github.com/tomxue/ChangeListBox.git 你可以从它开始。 谢谢!
【问题讨论】:
-
this.MyListBox.Foreground = new SolidColorBrush(Colors.Green);会将列表框中的所有文本更改为绿色。 -
完全不清楚为什么要在代码中创建 ContentControls,将数据项分配给它们的 Content 属性并将它们添加到 ListBox 的 Items 集合中。使用 ListBox 的典型方法是将一组数据项分配给 ItemsSource 属性。 DataTemplate 将用作 ListBox 的 ItemTemplate。