簡體   English   中英

如何在網格中顯示字節數組?

[英]How to display a byte array into a grid?

我有一個很大的字節數組。 我想將其綁定到具有固定列大小的網格,比方說10。

因此前10個字節將在第一行,下10個字節將在第二行...直到數組結尾。

我需要能夠編輯任何字節,並且這需要反映到數組中。 我的字節數組需要保留一個簡單的字節數組。

所有這些都使用WPF C#。

謝謝您的幫助!

編輯:

實際上,AS-CII的解決方案不會將更新的值保存到原始數組中。 我修改了示例以符合以下條件:

<DataGrid AutoGenerateColumns="False" Name="dataGrid1" ItemsSource="{Binding Bytes}" ColumnWidth="1*">
    <DataGrid.Columns>
        <DataGridTextColumn Header="1" Binding="{Binding [0]}"></DataGridTextColumn>
        <DataGridTextColumn Header="2" Binding="{Binding [1]}"></DataGridTextColumn>
        <DataGridTextColumn Header="3" Binding="{Binding [2]}"></DataGridTextColumn>
        <DataGridTextColumn Header="4" Binding="{Binding [3]}"></DataGridTextColumn>
        <DataGridTextColumn Header="5" Binding="{Binding [4]}"></DataGridTextColumn>
        <DataGridTextColumn Header="6" Binding="{Binding [5]}"></DataGridTextColumn>
        <DataGridTextColumn Header="7" Binding="{Binding [6]}"></DataGridTextColumn>
        <DataGridTextColumn Header="8" Binding="{Binding [7]}"></DataGridTextColumn>
        <DataGridTextColumn Header="9" Binding="{Binding [8]}"></DataGridTextColumn>
        <DataGridTextColumn Header="10" Binding="{Binding [9]}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

注意,唯一的更改是將Array [0]更改為[0]

public struct ArrayPiece<T>
    {       
        private T[] m_Data;
        private int m_Offset;
        private int m_Length;

        public T this[int index] { 
            get{                
                return m_Length > index? m_Data[m_Offset + index] : default(T);
            }

            set{
                if(m_Length > index)
                    m_Data[m_Offset + index] = value;
            }
        }

        public ArrayPiece(T[] array, int offset, int length)
            : this()
        {
            m_Data = array;
            m_Offset = offset;
            m_Length = length;         
        }
    }

這是新的ArrayPiece。

通過這些更改,當在UI中更改值時,該值將更新為原始數組。

這樣做有一個問題:如果最后一個ArrayPiece僅具有8個元素而不是10個,則與直接使用數組不同,在DataGrid中剩下的2個元素將顯示0。 我嘗試實現Length和LongLength屬性,但沒有成功。 如果我將索引超出范圍,則不會被捕獲。

謝謝!

這是WPF部分:

<DataGrid AutoGenerateColumns="False" Name="dataGrid1" ItemsSource="{Binding Bytes}" ColumnWidth="1*">
        <DataGrid.Columns>
            <DataGridTextColumn Header="1" Binding="{Binding Piece[0]}"></DataGridTextColumn>
            <DataGridTextColumn Header="2" Binding="{Binding Piece[1]}"></DataGridTextColumn>
            <DataGridTextColumn Header="3" Binding="{Binding Piece[2]}"></DataGridTextColumn>
            <DataGridTextColumn Header="4" Binding="{Binding Piece[3]}"></DataGridTextColumn>
            <DataGridTextColumn Header="5" Binding="{Binding Piece[4]}"></DataGridTextColumn>
            <DataGridTextColumn Header="6" Binding="{Binding Piece[5]}"></DataGridTextColumn>
            <DataGridTextColumn Header="7" Binding="{Binding Piece[6]}"></DataGridTextColumn>
            <DataGridTextColumn Header="8" Binding="{Binding Piece[7]}"></DataGridTextColumn>
            <DataGridTextColumn Header="9" Binding="{Binding Piece[8]}"></DataGridTextColumn>
            <DataGridTextColumn Header="10" Binding="{Binding Piece[9]}"></DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>

這是背后的代碼:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();

        // Set the datacontext
        this.DataContext = this;

        // Sample array generation
        byte[] array = new byte[138];

        for (int i = 0; i < array.Length; i++)
        {
            array[i] = (byte)i;
        }

        int length = (int)Math.Ceiling(array.Length / 10m);

        Bytes = (from i in Enumerable.Range(0, length)
                let offset = i * 10
                let count = offset + 10 > array.Length ? array.Length - offset : 10
                select new ArrayPiece<byte>(array, offset, count)).ToArray();
    }

    ArrayPiece<byte>[] _bytes;

    public ArrayPiece<byte>[] Bytes
    {
        get { return _bytes; }
        set { _bytes = value; OnPropertyChanged("Bytes"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public struct ArrayPiece<T>
{
    public T[] Piece { get; set; }

    public ArrayPiece(T[] array, int offset, int length) : this()
    {
        Piece = new T[length];
        Buffer.BlockCopy(array, offset, Piece, 0, length);
    }
}

我們使用LINQ將數組拆分為多行,然后通過WPF綁定將數據顯示到DataGrid中。

編輯:對於數組的大尺寸,我不認為這是一個問題,因為WPF中的DataGrid使用UI虛擬化,因此它只是分配了他需要顯示可見數據的內存。

我猜您可以使用ArraySegment的數組將行( ArraySegment )映射到基礎數組。 您需要將自己分割成多個部分,但這應該是一個簡單的循環。

編輯:
我對WPF不夠了解,無法知道是否可以綁定到ArraySegment索引。

具有固定寬度字體的文本框(例如Consolas或Courier New)是否有可能工作? 您可以編寫一個從byte[]string的值轉換器,或者如果您使用的是MVVM,請在那里進行轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM