WPF TreeViewItem Динамическая дочерняя видимость - PullRequest
0 голосов
/ 12 октября 2018

У меня есть 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;
    }
}

Пример, показывающий пространство, зарезервированное для свернутых стековых панелей (Источник равен нулю):

Example showing space reserved for Collapsed StackPanels

Пример с источником не равен нулю:

Example with Source not null

...