Member 12969975 Ответов: 1

Изменение шаблона стиля в коде


У меня есть шаблон заголовка для моего TreeViewItem, похожий на этот:

<DataTemplate>
        <StackPanel Orientation="Horizontal">
          <TextBlock Name="tbDoc" FontFamily="{StaticResource FontAwesome}"  Text="text" Foreground="Black" Padding="2" />
          <TextBlock Name="tbPart" FontFamily="{StaticResource FontAwesome}" Text="text" Foreground="Black" Padding="2" />
          <TextBlock Text="{Binding}"></TextBlock>
        </StackPanel>
</DataTemplate>


Я уже понимаю, что могу зафиксировать текст TreeViewItem с привязкой,
но как я могу отобразить изменение видимости этих двух текстовых блоков "tbDoc" и "tbPart" в коде, это должно выглядеть так:
SenderTreeViewItem.tbDoc.Visibility = Visibility.Hidden

...

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

поиск получения элементов стиля элемента отправителя

1 Ответов

Рейтинг:
2

Graeme_Grant

Вам нужно установить свойство Visibility элемента управления для переключения на основе условия, обычно выполняемого с помощью VisibilityConverter. Вот два конвертера, которые я использую:

public class VisibilityConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		if (value == null) return Visibility.Collapsed;
		if (value is int) return (int)value == 0 ? Visibility.Collapsed : Visibility.Visible;
		if (value is string) return string.IsNullOrEmpty((string)value) ? Visibility.Collapsed : Visibility.Visible;
		if (value is bool) return (bool) value ? Visibility.Visible : Visibility.Collapsed;

		return Visibility.Visible;
	}

	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		throw new NotImplementedException(); // not required - one-way conversion
	}
}

public class NotVisibilityConverter : IValueConverter
{
	public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
	{
		if (value == null) return Visibility.Visible;
		if (value is int) return (int)value != 0 ? Visibility.Collapsed : Visibility.Visible;
		if (value is string) return !string.IsNullOrEmpty((string)value) ? Visibility.Collapsed : Visibility.Visible;
		if (value is bool) return (bool)value ? Visibility.Collapsed : Visibility.Visible;

		return Visibility.Collapsed;

	}

	public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		throw new NotImplementedException(); // not required - one-way conversion
	}
}

Затем, чтобы использовать его, вам нужно свойство, к которому можно привязать преобразователь для определения состояния видимости. Приведенные выше преобразователи могут работать с bool, int, или string. Пример:
<Grid.Resources>
    <core:VisibilityConverter x:Key="VisibilityConverter"/>

<DataTemplate>
        <StackPanel Orientation="Horizontal">
          <TextBlock Name="tbDoc" Text="{Binding Name}"/>
          <TextBlock Name="tbPart" Text="{Binding FontAwesomeIcon}"

                     Visibility={Binding IsNew, Converter={StaticResource VisibilityConverter}}"/>
          <TextBlock Text="{Binding}"></TextBlock>
        </StackPanel>
</DataTemplate>
</Grid.Resources>

В этом примере tbPart TextBox будет виден только в том случае, если свойство bound IsNew == true


Member 12969975

Привет, Грэм грант, во-первых, спасибо за ваш аргумент, но как я установил IsNew в коде? это должно быть похоже на TreeViewItem.IsNew = = правда или что-то в этом роде?

Graeme_Grant

Вы создаете класс узла для каждого узла. Класс имеет свойства плюс коллекцию (ObservableCollection) классов узлов. Затем у вас есть свойство с коллекцией (ObservableCollection) узлов верхнего уровня. Это называется иерархическим объектом. Это может быть в коде позади или в модели представления (шаблон MVVM). Затем вы устанавливаете DataContext страницы / Window/UserControl/etc... / Treeview и привязываете свойство ItemsSource к свойству Collection. Ваш Treeview будет автоматически заполняться. Теперь в Code-behind или ViewModel вы можете установить значения каждого отдельного узла, и TreeView будет отражать измененные значения.

Звучит как много, но вот пример кода, который сделает его намного проще для понимания: Упрощение в WPF TreeView элемент с помощью шаблона модель представления [^]