我需要为我使用Json.Net序列化的每个对象添加一个'type'属性.我知道Json.Net已经支持这个开箱即用,但在我的情况下,类型名称需要排除程序集,并且属性的名称必须是可配置的(两者都不受支持).
我目前有这个:
public class TypeConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serialiser)
{
JObject jObject = JObject.FromObject(value, serializer);
jObject.AddFirst(new JProperty("myCustomTypePropertyName"), value.GetType().Name);
jObject.WriteTo(writer);
}
public override void ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serialiser)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return objectType.IsClass;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于正在序列化的外部类型,但遗憾的是没有为嵌套对象调用转换器.如果我将序列化器添加到JObject.FromObject调用中,那么我会尝试重新进入外部类型的转换器时出现自引用循环异常.
我可以解决这个问题的唯一方法是手动反映和迭代每个级别的属性,并使用serializer参数对它们进行序列化,但即使在考虑性能之前,它也非常难看.
我很感激对此的一些帮助; 我希望我遗漏了一些明显的东西.
(注意:我正在运行.NET 3.5,因此SerializationBinder是不可能的.)
我在我的MVVM WPF实现中有一个ListView,它有一个带有按钮的DataTemplate.ListView绑定到ViewModel中的一组复杂对象.
<ListView ItemsSource="{Binding Path=ComplexObjects}"
SelectedItem="{Binding Path=SelectedObject}"
Width="Auto">
<ListView.View>
<GridView>
<GridViewColumn Header="My Property">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Margin="6,2,6,2">
<TextBlock Text="{Binding MyProperty}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="First Name">
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel Margin="6,2,6,2">
<Button Command="{Binding ???}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
Run Code Online (Sandbox Code Playgroud)
所有文本字段都没有问题,但是我可以将Button Command绑定到ComplexObject的成员方法吗?如果是这样,有什么方法可以传递参数?
我有一种感觉,我可能只是在逃避使用ICommand.
谢谢.