Patrick Skelton Ответов: 2

Как получить доступ к alternationcount в WPF treeview?


У меня есть некоторые данные в моей view-модели, которая выглядит примерно так:
public class CostItem
{
	public string Description { get; set; }

	public int Quantity { get; set; }
	
	public double UnitCost { get; set; }
}


public class Section
{
	public string Name { get; set; }

	List<CostItem> CostItems { get; }
}


Я показываю его с помощью следующего TreeView:

<TreeView x:Name="TreeViewBreakdown" ItemsSource="{Binding Sections}"
	AlternationCount="2">
	<TreeView.Resources>
		<HierarchicalDataTemplate DataType="{x:Type me:Section}" ItemsSource="{Binding CostItems}">
			<TextBlock Text="{Binding Name}"/>
		</HierarchicalDataTemplate>
		<DataTemplate DataType="{x:Type me:CostItem}">
			<Grid>
				<Grid.RowDefinitions>
					<RowDefinition Height="Auto"/>
				</Grid.RowDefinitions>
				<Grid.ColumnDefinitions>
					<ColumnDefinition/>
					<ColumnDefinition/>
					<ColumnDefinition/>
				</Grid.ColumnDefinitions>
				<TextBox Grid.Row="0" Grid.Column="0" Text="{Binding Description}"/>
				<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Quantity}"/>
				<TextBox Grid.Row="0" Grid.Column="2" Text="{Binding UnitCost}"/>
			</Grid>
		</DataTemplate>
	</TreeView.Resources>
</TreeView>

То, что я хотел бы сделать, это подать заявку и получить доступ к AlternationIndex к CostItem дочерние узлы, отображаемые этим TreeView, так что я могу чередовать цвет фона. Есть ли какой - нибудь способ сделать это?

дополнительное Примечание:
Углубившись в это, я думаю, что есть одна центральная вещь, которую я не могу понять. Я объявил два шаблона в своем TreeView, один иерархический и один нормальный, и они выбираются по типу привязываемого объекта. Пока все хорошо.

В случае с нормальным DataTemplate в моем XAML, насколько я понимаю, применяется именно этот шаблон для каждого дочернего элемента То, что я на самом деле хочу иметь возможность сказать TreeView это что-то вроде: "Когда вы привязываетесь к моему родительскому классу, я хочу, чтобы вы использовали, скажем, a ListView или DataGrid для всех детей этого родителя"Это трудно объяснить, но я был бы очень благодарен за разъяснение этого центрального пункта (если кто-нибудь понимает, о чем я болтаю)?

Что я уже пробовал:

Кажется, что мне нужно вот это (взято из элемент DataGrid - как сделать GridView в дочерний элемент в TreeView в WPF-приложения - переполнение стека [^] ):

public class Customer
{
    public string Name { get; set; }
    public IEnumerable<Order> Orders { get; set; }
}

public class Order
{
    public DateTime PurchaseDate { get; set; }
    public IEnumerable<OrderItem> Items { get; set; }
}

public class OrderItem
{
    public string ProductName { get; set; }
    public int Quantity { get; set; }
    public double UnitPrice { get; set; }
    public double TotalPrice { get; set; }
}


&ЛТ;TreeView элемент х:имя="_treeView", что ItemsSource="{привязки}"&ГТ;
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type data:Customer}"
ItemsSource="{Binding Path=Orders}">
<TextBlock Text="{имя привязки}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type data:Order}">
<StackPanel>
<TextBlock Text="{Binding PurchaseDate}"/>
<ListView ItemsSource="{Binding Items}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding ProductName}" />
<GridViewColumn DisplayMemberBinding="{количество привязки}" />
<GridViewColumn DisplayMemberBinding="{Binding UnitPrice}" />
<GridViewColumn DisplayMemberBinding="{Binding TotalPrice}" />
</GridView>
</ListView.View>
</ListView>
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>

За исключением того, что мне нужно сделать, это отрубить верхний уровень этого дерева (т. е. Customer уровень. У меня такое чувство, что я тупой, но я просто не могу понять синтаксис, чтобы сделать это. Поскольку у меня есть только два уровня, родитель и ребенок, нужен ли мне вообще HierarchicalDataTemplate- Вот тут-то я и ошибаюсь ?

2 Ответов

Рейтинг:
2

RickZeeland

Используя этот пример: https://www.dotnetperls.com/treeview-wpf[^]
Я обнаружил, что вы можете установить цвет элементов TreeView в коде позади, как это:

TreeViewItem item = new TreeViewItem();
item.Header = "Computer";
item.Background = System.Windows.Media.Brushes.Yellow;

Другим вариантом может быть использование этого пользовательского элемента управления с открытым исходным кодом: MultiSelectTreeView control – разработка неклассифицированного программного обеспечения[^]


Рейтинг:
0

RickZeeland

Вот пример для Listbox, но вы, вероятно, можете использовать ту же технику для TreeView: Пользовательский список WPF с окантовкой и раскраской в коде[^]

И вот это дерево, например: Средства WPF 3.5 с пакетом обновления 1: чередованием – блог-Винсент в Сибаи [^]

Хотя этот пример кажется стандартным WPF, некоторые его части используют ПРИЗМА рамки: Представление о создании регионов и адаптерах регионов в приложениях WPF на основе Prism[^]


Patrick Skelton

Спасибо за ответ. Я отмечу это как решение, но откладываю эксперимент, потому что до сих пор он у меня не работает. Я изо всех сил пытаюсь увидеть разницу между тем, что у меня есть, и примером во второй ссылке, которую вы дали, но когда я смотрю в живое визуальное дерево, я всегда получаю AlternationIndex 2, независимо от любых изменений, которые я делаю в AlternationCount либо в Родительском TreeView, либо в его корневом HierarchicalDataTemplate. Есть идеи, что может пойти не так? (Меня озадачивает, что он всегда равен 2; это как если бы он маркировал элементы в соответствии с глубиной в визуальном дереве.)

Patrick Skelton

Модификация моего предыдущего комментария для редактирования нейтральных битов мозга: в Живом визуальном дереве я читал "AlternationCount" как "AlternationIndex". можно ли увидеть последнее в Живом визуальном дереве?

RickZeeland

Пример TreeView, по-видимому, использует фреймворк PRISM, извините за это!
Поскольку мой WPF Fu датируется уже много лет назад, боюсь, я не смогу вам сильно помочь в этом вопросе.