我的项目中有一个带有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):
来源不为空的示例: