2014-04-07 1 views
5

UserControl 안에 DataGrid이 있습니다. 그것은 다음과 같습니다문자열 배열을 WPF DataGrid에 자동 바인딩하는 방법은 무엇입니까?

<Window x:Class="ExternalDataSourceComparison.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ExternalDataSourceComparison" 
    Title="MainWindow" Height="350" Width="525" WindowState="Maximized"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <local:ImportedInfoGrid x:Name="ExternalData" Grid.Row="0"/> 
    <StackPanel Height="36px" Orientation="Horizontal" Grid.Row="1"> 
     <Button Name="_import" Content="Import Data" Margin="5" Padding="5, 2" Click="Import_Click"/> 
     <Button Name="_compare" Content="Compare" Margin="5" Padding="5, 2" Click="Compare_Click"/> 
     <Button Name="_cancel" Content="Cancel" Margin="5" Padding="5, 2" Click="Cancel_Click"/>    
    </StackPanel> 
</Grid> 
윈도우의 뒤에 내 코드에서

이 방법 fs.CSVToStringArray을 사용하여 :

<UserControl x:Class="ExternalDataSourceComparison.ImportedInfoGrid" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" 
     Height="Auto" Width="Auto"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <DataGrid Name="_dataGrid" Grid.Row="0"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Path[0].Length}"/> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

I는 다음과 같습니다 내 MainWindow에서 UserControl이 , CSV 파일을 열어 내용을 구문 분석하여 string[][] 외부 배열이 행과 내부 arr을 나타냅니다. 문자열 [0] [3] I는 단지 어레이의 배열과 동일 ItemsSource 설정 뒤에 내 코드에서 행 1 열 4

될 수 있도록 다음과 같이 바깥 열의 모든 위치 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Data; 

namespace ExternalDataSourceComparison 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     FileStuff fs = new FileStuff(); 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Import_Click(object sender, RoutedEventArgs e) 
     { 
      string[][] array = fs.CSVToStringArray(); 
      this.ExternalData._dataGrid.ItemsSource = array; 
     } 

     private void Cancel_Click(object sender, RoutedEventArgs e) 
     { 

     } 

     private void Compare_Click(object sender, RoutedEventArgs e) 
     { 

     } 
    } 
} 

출력은 내가 기대 한 바가 아니다. 나는 실제 내용 대신 객체의 속성을 보여주는 것으로 생각한다. 자동으로 행과 열을 생성하는 방법이 있습니까? 아니면 열을 만들고 행을 작성하는 코드를 작성해야합니까? 나는 DataGrid으로 string[][] 또는 List<string[]>과 같은 것을 ItemsSource에 바인딩 할 수 있다고 생각했습니다. 그냥 열을 생성했을 것입니다. 현재 열을 자동으로 생성하고 있으며, 단지 string[][]의 내용으로 채우지 않습니다.

답변

10

DataGrid의 자동 생성 열 기능은 톱니 모양의 배열 데이터를 표시하는 데 적합하지 않습니다. DataGrid의 각 행이 컬렉션의 단일 항목을 나타내는 단일, 1 차원 컬렉션에 더 적합하며 각 열은 해당 항목의 다른 속성을 나타냅니다.

ItemsSource의 항목이 표시 준비가 된 모델이 아니면 표시 할 수없는 속성을 포함하여 모든 속성에 대한 열을 표시하는 열 자동 생성 기능에 의존해서는 안됩니다. 을 자동으로 시도 할 때 또 다른 문제가DataGrid 배열에 있습니다. DataGrid에는 열의 이름을 지정하는 방법에 대한 정보가 없습니다.

결국 DataGrid 대신 자체적으로 열을 생성하는 대신 DataGrid 열을 어떻게 든 정의하는 것이 좋습니다.

: 경우에 당신은 예를 들어, 열 동적 번호를 가지고,

<DataGrid Name="_dataGrid" Grid.Row="0" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column 1" Binding="{Binding [0]}"/> 
     <DataGridTextColumn Header="Column 2" Binding="{Binding [1]}"/> 
    </DataGrid.Columns> 
</DataGrid> 

또는 코드에서 열을 정의 : 어느 당신은 항상 배열이 "열"을 가지고 가정, 예를 들어, XAML에서 정의

string[][] array = fs.CSVToStringArray(); 
for (int i = 0; i < array[0].Length; i++) 
{ 
    var col = new DataGridTextColumn(); 
    col.Header = "Column " + i; 
    col.Binding = new Binding(string.Format("[{0}]", i)); 
    _dataGrid.Columns.Add(col); 
} 
this.ExternalData._dataGrid.ItemsSource = array; 
관련 문제