WPF TreeViewItem动态子级可见性

时间:2018-10-12 10:58:37

标签: c# wpf xaml treeview treeviewitem

我的项目中有一个带有HierarchicalDataTemplate的TreeView,我试图为某些日志数据创建一个漂亮的视图,每个日志行都应该可扩展,并具有有关该日志记录的来源,时间等的一些其他信息

要填充TreeView,我正在使用LogRecord的集合。

LogRecord类中包含一些可为空的字段,并且可能没有关系,而是从JSON反序列化。

我要能够做的是基于字段为空/填充来修改树视图项目节点的可见性。我创建了一个绑定转换器ObjectNullToVisibilityConverter可以做到这一点,并且我已经验证它确实返回Visibilty.Collapsed和Visibility.Visible。

但是,当您查看树时,堆栈面板的空间仍在UI中保留,我认为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;
    }
}

示例显示为折叠的StackPanels保留的空间(源为null):

Example showing space reserved for Collapsed StackPanels

来源不为空的示例:

Example with Source not null

0 个答案:

没有答案