C# ConvertBack 从文本框的绑定列到 JObject

C# ConvertBack from a binding column of textbox to a JObject

美好的一天! 我不擅长 wpf 和绑定,我需要你的帮助。我已经将 Json 对象 (JObject) 绑定到 TextBox 的列。

<TextBox Width="250" Text="{Binding Path=Property, Converter={StaticResource jPropertyConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />    

当我启动我的 wpf 时,我可以正确显示 Jobject 的数据 window,现在我需要 ConvertBack 当我修改其中一个列的文本框时修改的数据,从那个 TextBox 到 JObject ,以及相关的 JValue。

public class JPropertyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is JProperty)
        {
            JToken valoreProperty = (value as JProperty).Value;
            if ((valoreProperty is JValue))
                return (valoreProperty as JValue).Value;
        }
        return DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ??
    }
}

我可以像这样更改此 JObject 树的 "leaves" 的值:

(valoreProperty as JValue).Value = "Hello!";

如何在转换回来的过程中更改此 JObject 树的 "leaves"? 对不起我的英语不好。 谢谢再见

编辑: 谢谢数据库!成功了,非常感谢!

现在我需要在另一列中显示文本框中值的每个长度,显然如果我更改文本框中的值,相对长度值也会改变。

我试过:

<DataGridTextColumn Header="Lunghezza2" IsReadOnly="True"  Width="50" Binding="{Binding Path=Property.Value.Value.toString().Length, UpdateSourceTrigger=PropertyChanged, Mode=OneWay}"  />

或者以另一种方式使用转换器,传递 JProperty

 public class LengthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is JProperty)
        {
            JToken jValue = (value as JProperty).Value;
            if ((jValue is JValue) && (jValue as JValue).Value != null)
                return (jValue as JValue).Value.ToString().Length.ToString();
            else
                return "0";
        }
        else
            return "";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

但是当我更改文本框值时,每次尝试都不起作用,有什么提示吗? 再次感谢!

为此您不需要转换器。假设你的Property属性returns一个JProperty,你可以直接绑定到JProperty.Value.Value

            <TextBox Name="PropertyTextBox" 
                     Text="{Binding Path=Property.Value.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                     />

如果你想禁用 TextBox 如果绑定 Property 不是 "simple" JProperty(一个只有 JValue 作为它的值), 你可以这样做:

            <TextBox Name="PropertyTextBox" 
                     Text="{Binding Path=Property.Value.Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                     IsEnabled="{Binding Path=Property, Converter={StaticResource IsSimpleJPropertyConverter}, Mode=OneWay}"
                     />

使用转换器

public class IsSimpleJPropertyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value is JProperty)
        {
            JToken jValue = (value as JProperty).Value;
            if (jValue is JValue)
                return true;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}