WPF – 改变代码背后的样式

我有一个列表框,显示TFS查询的结果。 我想在后面的代码中更改ListBoxItem的样式,以获得包含在查询结果中的列。

ListBoxItem的样式在我的Windows.Resoruces部分中定义。 我试过这个:

public T GetQueryResultsElement(string name) where T : DependencyObject { ListBoxItem myListBoxItem = (ListBoxItem)(lstQueryResults.ItemContainerGenerator.ContainerFromIndex(0)); // Getting the ContentPresenter of myListBoxItem ContentPresenter myContentPresenter = myListBoxItem.Template.LoadContent().FindVisualChild(); // Finding textBlock from the DataTemplate that is set on that ContentPresenter DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; <------+ T myControl = (T)myDataTemplate.FindName(name, myContentPresenter); | | return (T)myControl; | } | | ContentTemplate is null ----------------------------------------------+ 

但ContentTemplate为null。 我从这里获得了代码,然后使用LoadContent调用对其进行了修改(原始代码为ContentPresenter赋予了null)。

无论如何。 如果您知道改变代码中现有样式的方法,我很乐意看到它。


具体如果你想要它们:
我将在ListBoxItem样式中使用WrapPanel。 这就是我想要添加额外的TextBlock项目。

这是我风格的一部分:

                             

你在这里反对谷物,试图直接在代码隐藏中操纵视觉元素。 有一个涉及数据绑定的简单解决方案。

我将提供一般解决方案,因为我不知道您的解决方案的具体细节。

获得查询结果后,创建一个返回列名的枚举,以及每次迭代的字段值。

例:

 class NameValuePair { public string Name { get; set; } public object Value { get; set; } } public IEnumerable> EnumerateResultSet(DataTable resultSet) { foreach (DataRow row in resultSet.Rows) yield return EnumerateColumns(resultSet, row); } public IEnumerable EnumerateColumns(DataTable resultSet, DataRow row) { foreach (DataColumn column in resultSet.Columns) yield return new NameValuePair { Name = column.ColumnName, Value = row[column] }; } 

在您的代码隐藏中,一旦获得DataTable结果集,请执行以下操作:

 myResultsList.ItemsSource = EnumerateResultSet(myDataTable); 

XAML可能如下所示:

                   

样本输出:

样本输出图像