C# 如何让WPF listview将字节数组格式化为逗号分隔的字符串?
我正在尝试将一些数据绑定到WPF listview。我的数据类型的属性之一是类型C# 如何让WPF listview将字节数组格式化为逗号分隔的字符串?,c#,wpf,data-binding,listview,datatemplate,C#,Wpf,Data Binding,Listview,Datatemplate,我正在尝试将一些数据绑定到WPF listview。我的数据类型的属性之一是类型byte[],我希望它显示为逗号分隔的字符串,因此例如{12,54}将显示为12,54,而不是byte[]Array。我想我想做一个定制的数据模板,但我不确定。这是最好的办法吗?如果是,我该怎么做?如果没有,最好的方法是什么 编辑:我只想对一列使用此选项-其他属性按原样显示良好。我将创建一个创建逗号分隔字符串的ValueConverter。然后您可以直接绑定到字节[],但在绑定中指定转换器 (如果Mark的答案是正确
byte[]
,我希望它显示为逗号分隔的字符串,因此例如{12,54}
将显示为12,54
,而不是byte[]Array
。我想我想做一个定制的数据模板
,但我不确定。这是最好的办法吗?如果是,我该怎么做?如果没有,最好的方法是什么
编辑:我只想对一列使用此选项-其他属性按原样显示良好。我将创建一个创建逗号分隔字符串的
ValueConverter
。然后您可以直接绑定到字节[]
,但在绑定中指定转换器
(如果Mark的答案是正确的,我不需要输入代码。)我建议使用ValueConverter:
[ValueConversion(typeof(byte []), typeof(string))]
public class ByteArrayConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
byte [] bytes = (byte [])value;
StringBuilder sb = new StringBuilder(100);
for (int x = 0; x<bytes.Length; x++)
{
sb.Append(bytes[x].ToString()).Append(" ");
}
return sb.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotSupportedException();
}
#endregion
}
[ValueConversion(typeof(byte[])、typeof(string))]
公共类ByteArrayConverter:IValueConverter
{
#区域转换器成员
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
字节[]字节=(字节[])值;
StringBuilder sb=新StringBuilder(100);
对于(intx=0;x我设置了以下示例,该示例演示了使用值转换器的绑定
以下是Window1.xaml.cs:
private ObservableCollection<ByteData> _collection = new ObservableCollection<ByteData>();
public Window1()
{
InitializeComponent();
_collection.Add(new ByteData(new byte[] { 12, 54 }));
_collection.Add(new ByteData(new byte[] { 1, 2, 3, 4, 5 }));
_collection.Add(new ByteData(new byte[] { 15 }));
}
public ObservableCollection<ByteData> ObservableCollection
{
get { return _collection; }
}
public class ByteData
{
byte[] _data;
public ByteData(byte[] data)
{
_data = data;
}
public byte[] Data
{
get { return _data; }
set { _data = value; }
}
}
private observetecollection\u collection=new observetecollection();
公共窗口1()
{
初始化组件();
_Add(新字节数据(新字节[]{12,54}));
_Add(新字节数据(新字节[]{1,2,3,4,5}));
_Add(新字节数据(新字节[]{15}));
}
公共可观测集合可观测集合
{
获取{return\u collection;}
}
公共类字节数据
{
字节[]_数据;
公共字节数据(字节[]数据)
{
_数据=数据;
}
公共字节[]数据
{
获取{return_data;}
设置{u data=value;}
}
}
以下是Window1.xaml:
<Window x:Class="TestWpfApplication.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWpfApplication"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="300" Width="300"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<local:ByteToStringConverter x:Key="byteToStringConverter"/>
</Window.Resources>
<StackPanel>
<ListView ItemsSource="{Binding ObservableCollection}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBox Width="200" Text="{Binding Path=Data, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged, Converter={StaticResource byteToStringConverter}}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
这是值转换器:
public class ByteToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
byte[] data = (byte[])value;
StringBuilder byteString = new StringBuilder();
int idx;
for (idx = 0; idx < data.Length - 1; idx++)
{
byteString.AppendFormat("{0}, ", data[idx]);
}
byteString.Append(data[idx]);
return byteString.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// If you want your byte-data to be editable in the textboxes,
// this will need to be implemented.
return null;
}
}
公共类ByteToStringConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
{
字节[]数据=(字节[])值;
StringBuilder byteString=新的StringBuilder();
int-idx;
对于(idx=0;idx
如何:返回BitConverter.ToString((byte[])值。替换(“-”,“,”);
作为Convert
方法的主体?啊,比我强。回答很好。@Luke:这是个好主意。我从未使用过BitConverter,但它看起来很方便:)我得到“'local'是一个未声明的命名空间。第32行,位置10。'XML无效。”@Simon:您需要将名称空间引用添加到xaml文件顶部的local。例如,如果您在其中定义了ValueConverter的名称空间称为MyNamespace,则需要:
public class ByteToStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
byte[] data = (byte[])value;
StringBuilder byteString = new StringBuilder();
int idx;
for (idx = 0; idx < data.Length - 1; idx++)
{
byteString.AppendFormat("{0}, ", data[idx]);
}
byteString.Append(data[idx]);
return byteString.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
// If you want your byte-data to be editable in the textboxes,
// this will need to be implemented.
return null;
}
}