C# 如何让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的答案是正确

我正在尝试将一些数据绑定到WPF listview。我的数据类型的属性之一是类型
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;
    }
}