如何正确地将列表 <byte> 形式的 ASCII 字符串绑定到文本框?

How do I properly bind an ASCII string in the form of a list<byte> to a textbox?

我有一个表示 ASCII 字符串的列表,我试图让它通过文本框进行编辑。我已经像这样设置了绑定:

public List<byte> ParamData;

var b = new TextBox();
b.DataContext = ParamData;
var binding = new Binding(".");
binding.Converter = new ListToStringConverter();
binding.Mode = BindingMode.TwoWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.SetBinding(TextBox.TextProperty, binding);


internal class ListToStringConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        var orig = (List<byte>) value;
        var res = Encoding.ASCII.GetString(orig.ToArray());
        return res;

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        var orig = (string) value;
        var res = Encoding.ASCII.GetBytes(orig);
        return new List<byte>(res);
    }
}

但是,我发现更改 textbos 中的文本不会触发 ConvertBack,并且 ParamData 实际上不会得到更新。我已经尝试在文本框中的文本更改时触发 UpdateSource(),但它仍然没有。

有什么想法吗?

您需要将绑定源设置为属性,可以通过绑定更新。截至目前,绑定使用整个对象作为其源并且不能用完全不同的对象替换它(来自 ConvertBack 方法的新列表)

public class ByteListWrapper
{
    public List<byte> ParamData { get; set; }
}

var b = new TextBox();
b.DataContext = new ByteListWrapper { ParamData = someData };
var binding = new Binding("ParamData")
{
    Converter = new ListToStringConverter(),
    Mode = BindingMode.TwoWay,
    UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
};

b.SetBinding(TextBox.TextProperty, binding);

再次如此:现在绑定更新源的值 属性,而不是替换源(它不能这样做)