[英]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.