gpt4 book ai didi

json - 如何将动态 json 绑定(bind)到 treeview wpf

转载 作者:可可西里 更新时间:2023-11-01 06:30:57 25 4
gpt4 key购买 nike

我得到的 JSON 如下:

explain format = json select...

文本因操作符选择的类型而异。如何在 treeView 中绑定(bind)动态 JSON 或者在 wpf 中绑定(bind) UML。感谢您的建议

最佳答案

您可以使用 Json.NET 来做到这一点框架。 Json.NET 有一个静态方法 JToken.Parse() (其目的类似于 XDocument.Parse() )并且可以将有效的 JSON 字符串转换为 Newtonsoft.Json.Linq.JToken 的层次结构对象。此层次结构可以绑定(bind)到 WPF TreeView 中使用 DataTemplate 控制和 HierarchicalDataTemplate格式化来自 JToken 的所有可能子类的数据并遍历它们的子类。

需要模板的具体 Json.NET JToken 类是:

为了将这些类的层次结构绑定(bind)到树中,您首先需要一个 converter转换 JToken.Children()方法到属性中:

// Respectfully adapted from https://stackoverflow.com/questions/502250/bind-to-a-method-in-wpf/844946#844946

public sealed class MethodToValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var methodName = parameter as string;
if (value == null || methodName == null)
return null;
var methodInfo = value.GetType().GetMethod(methodName, new Type[0]);
if (methodInfo == null)
return null;
return methodInfo.Invoke(value, new object[0]);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException(GetType().Name + " can only be used for one way conversion.");
}
}

完成此操作后,可以在树中显示此层次结构的极其简单的 XAML 标记是:

<Window x:Class="WpfJsonTreeViewNew.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:w="clr-namespace:WpfJsonTreeViewNew"
xmlns:json ="clr-namespace:Newtonsoft.Json;assembly=Newtonsoft.Json"
xmlns:jlinq ="clr-namespace:Newtonsoft.Json.Linq;assembly=Newtonsoft.Json"
Title="Window1" Height="1000" Width="600">
<Window.Resources>
<w:MethodToValueConverter x:Key="MethodToValueConverter"/>
<HierarchicalDataTemplate DataType="{x:Type jlinq:JArray}" ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='Children'}">
<TextBlock Text="Array">
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type jlinq:JProperty}" ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='Children'}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Property name: "/>
<TextBlock Text="{Binding Path=Name, Mode=OneWay}"/>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type jlinq:JObject}" ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='Children'}">
<TextBlock Text="Object">
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type jlinq:JConstructor}" ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='Children'}">
<TextBlock Text="Constructor">
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type jlinq:JRaw}" ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter='Children'}">
<TextBlock Text="Raw">
</TextBlock>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type jlinq:JValue}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Value: "/>
<TextBox Text="{Binding Path=Value, Mode=TwoWay}"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<TreeView Margin="3" Name="treeView1">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
</Grid>
</Window>

然后,当您的用户选择要查看的 JSON 数据时,您可以:

        var token = JToken.Parse(jsonString);

var children = new List<JToken>();
if (token != null)
{
children.Add(token);
}

treeView1.ItemsSource = null;
treeView1.Items.Clear();
treeView1.ItemsSource = children;

结果如下:

enter image description here

对于sample JSON :

{
""id"": ""0001"",
""type"": ""donut"",
""name"": ""Cake"",
""ppu"": 0.55,
""batters"":
{
""batter"":
[
{ ""id"": ""1001"", ""type"": ""Regular"" },
{ ""id"": ""1002"", ""type"": ""Chocolate"" },
{ ""id"": ""1003"", ""type"": ""Blueberry"" },
{ ""id"": ""1004"", ""type"": ""Devil's Food"" }
]
},
""topping"":
[
{ ""id"": ""5001"", ""type"": ""None"" },
{ ""id"": ""5002"", ""type"": ""Glazed"" },
{ ""id"": ""5005"", ""type"": ""Sugar"" },
{ ""id"": ""5007"", ""type"": ""Powdered Sugar"" },
{ ""id"": ""5006"", ""type"": ""Chocolate with Sprinkles"" },
{ ""id"": ""5003"", ""type"": ""Chocolate"" },
{ ""id"": ""5004"", ""type"": ""Maple"" }
]
}

当然,用户界面可以做得更漂亮,例如通过将 JProperty 标记的值与只有一个 JValue 子代的值放在同一行上。但是,这应该让您了解如何进行绑定(bind)。

这种方法将 JSON 直接绑定(bind)到树。如果您正在寻找完整的编辑功能,包括添加、删除和重命名节点,您可能需要切换到 "Model-View-ViewModel" methodology其中 JToken 层次结构成为模型,轻量级 View 模型处理修改和通知。

关于json - 如何将动态 json 绑定(bind)到 treeview wpf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23812357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com