2010-10-20 21 views
1

我有一个可能非常大的字节数组。我想将其绑定到与柱的固定大小的网格,让说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> 

通知的唯一的变化是阵列[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中,2人给出的元件将在数据网格显示0直接使用阵列时不同。我试图实现长度和LongLength属性没有成功。如果我抛出索引,它不会被捕获。

谢谢!

+0

你能定义非常大的 – 2010-10-20 20:29:16

+0

好吧,没那么大,<1000字节 – Dist01 2010-10-20 22:00:49

回答

1

这是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虚拟化,所以它只是分配他需要显示可见数据的内存。

0

我想你可以使用一个ArraySegment的数组来映射你的行(ArraySegment)到底层数组。你需要对自己进行细分,但这应该是一个简单的循环。

编辑:
我不知道WPF不够好,知道你是否能绑定到的ArraySegment或没有索引。

0

是否有机会与一个固定宽度字体的文本框(如索拉或宋体)将工作?你可以编写一个值转换器,从byte[]string,或者如果你使用MVVM在那里做翻译。

相关问题