如何正确地将列表 <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);
再次如此:现在绑定更新源的值 属性,而不是替换源(它不能这样做)
我有一个表示 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);
再次如此:现在绑定更新源的值 属性,而不是替换源(它不能这样做)