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 элемент с помощью шаблона модель представления [^]