У меня есть TreeView в моем проекте с HierarchicalDataTemplate, и я пытаюсь создать хороший вид для некоторых данных журнала, каждая строка журнала должна быть расширяемой и иметь некоторую дополнительную информацию об источнике, времени и т. Д. Для этой записи журнала
Чтобы заполнить TreeView, я использую коллекцию LogRecord.
В классе LogRecord есть некоторые пустые поля, и, вероятно, не относящиеся к нему, но он десериализован из JSON.
Что я хочучтобы иметь возможность сделать это, измените видимость узлов элемента древовидной структуры, основываясь на том, что поле пусто / заполнено.Я создал конвертер привязки ObjectNullToVisibilityConverter, который может это сделать, и я убедился, что он возвращает Visibilty.Collapsed и Visibility.Visible правильно.
Однако, когда вы просматриваете дерево, пространство для стековой панели по-прежнему зарезервировано в пользовательском интерфейсе, я подумал, что Collapsed должен помешать ему зарезервировать это пространство в макете.
Любые идеи илиальтернативные способы получить то, что я ищу?
Спасибо
Пример класса:
public class LogRecord
{
[JsonProperty(PropertyName = "source")]
public uint? Source { get; set; }
[JsonProperty(PropertyName = "ts")]
public ulong Timestamp{ get; set; }
[JsonProperty(PropertyName = "text")]
public string Text { get; set; }
}
Пример макета WPF:
<HierarchicalDataTemplate DataType="{x:Type dataTypes:LogRecord}">
<TreeViewItem Header="{Binding Text}">
<StackPanel Orientation="Horizontal" Visibility="{Binding Source, Converter={local:ObjectNullToVisibilityConverter}}">
<TextBlock Text="Source: " />
<TextBlock Text="{Binding Source}" />
</StackPanel>
<TextBlock Text="{Binding Timestamp}" />
</TreeViewItem>
</HierarchicalDataTemplate>
Преобразователь видимости привязки:
public class ObjectNullToVisibilityConverter : System.Windows.Markup.MarkupExtension, IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Visibility objVisibility = value == null
? Visibility.Collapsed : Visibility.Visible;
return objVisibility;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return null;
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
Пример, показывающий пространство, зарезервированное для свернутых стековых панелей (Источник равен нулю):
Пример с источником не равен нулю: