2012-06-02 7 views
3

Curve 객체 목록이 포함 된 Log 객체가 있습니다. 각 커브에는 Name 속성과 double의 배열이 있습니다. 이름이 열 머리글과 그 아래의 데이터에 있어야합니다. 데이터 컨트롤을 가진 사용자 정의 컨트롤이 있습니다. 다음은 XAML입니다. 내가 그들을 열을 만들고 이름을하는 방법을 알아 낸 것,하지만 데이터를 바인딩하는 방법을 알아 냈하지 않은 뒤에 코드에서 배열을 WPF 데이터 격자의 열에 바인딩하는 방법

<UserControl x:Class="WellLab.UI.LogViewer" 
     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="500" d:DesignWidth="500"> 
<Grid> 
    <StackPanel Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="stackPanel1" VerticalAlignment="Stretch" Width="Auto"> 
     <ToolBarTray Height="26" Name="toolBarTray1" Width="Auto" /> 
     <ScrollViewer Height="Auto" Name="scrollViewer1" Width="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" Background="#E6ABA4A4"> 
      <DataGrid AutoGenerateColumns="True" Height="Auto" Name="logDataGrid" Width="Auto" ItemsSource="{Binding}" HorizontalAlignment="Left"> 
      </DataGrid> 
     </ScrollViewer> 
    </StackPanel> 
</Grid> 

.

public partial class LogViewer 
{ 
    public LogViewer(Log log) 
    { 
     InitializeComponent(); 

     foreach (var curve in log.Curves) 
     { 
      var data = curve.GetData(); 
      var col = new DataGridTextColumn { Header = curve.Name }; 
      logDataGrid.Columns.Add(col); 
     } 
    } 
} 

아무것도 근처에도 오지 이후, 나는 배열 "데이터를"바인딩 사용하려고 코드를 보여도 못해. 나는 간단한 것을 놓치고있을 것이라고 확신하지만, 웹 검색을 몇 시간 동안 해본 후에, 나는 대답을 간청해야만한다.

+0

가능 중복 된 [I 배열 요소를 표시하는 방법 WPF DataGrid에서?] (http://stackoverflow.com/questions/5582226/how-can-i-display-array-elements-in-a-wpf-datagrid) –

+0

@dbaseman : 배열에 도움이되지 않습니다. b가 없으므로 그것들을 다루기위한 논리. –

+0

@ H.B. 해명 해줘서 고마워. 나는 그 질문을 오해했다. – McGarnagle

답변

3

로그 데이터를 RowDataItem의 컬렉션으로 피벗해야합니다. 각 행에는 Curve에 하나씩 두 값의 모음이 포함되어 있습니다. 동시에 열 이름을 추출 할 수 있습니다. 그래서 데이터는 이렇게 될 것입니다.

public class PivotedLogData : ViewModelBase 
{ 
    public PivotedLogData(Log log) 
    { 
     ColumnNames = log.Curves.Select(c => c.Name).ToList(); 

     int numRows = log.Curves.Max(c => c.Values.Count); 

     var items = new List<RowDataItem>(numRows); 

     for (int i = 0; i < numRows; i++) 
     { 
      items.Add(new RowDataItem(
          log.Curves.Select(
           curve => curve.Values.Count > i 
              ? curve.Values[i] 
              : (double?) null).ToList())); 
     } 

     Items = items; 
    } 

    public IList<string> ColumnNames { get; private set; } 
    public IEnumerable<RowDataItem> Items { get; private set; } 
} 

public class RowDataItem 
{ 
    public RowDataItem(IList<double?> values) 
    { 
     Values = values; 
    } 

    public IList<double?> Values { get; private set; } 
} 

그럼 당신은 위와 같이하지만 적절한 지금 그리드에 데이터를 바인딩

var pivoted = new PivotedLogData(log); 

int columnIndex = 0; 

foreach (var name in pivoted .ColumnName) 
{ 
    dataGrid.Columns.Add(
     new DataGridTextColumn 
      { 
       Header = name, 
       Binding = new Binding(string.Format("Values[{0}]", columnIndex++)) 
      }); 
} 

을 바인딩 DataGridTextColumn 항목을 만들 것

dataGrid.ItemsSource = pivoted.Items; 
+0

예를 들어 주셔서 감사합니다. 그것은 완벽하게 작동합니다. 불행하게도 두 가지 문제점이 있습니다. 데이터 그리드가 너무 느립니다. 25,000 개의 항목이있는 그리드를 열려면 10 초가 걸렸습니다. 이 작은 숫자는 거의 즉시 열립니다. 또한 내 로그에서 단일 커브를 삭제하고 그리드의 열이 사라지는 것을 볼 수 있어야합니다. – spainchaud

+0

더 자세히 설명하기 위해 필자는 필자와 비슷한 데이터 구조를 사용하는 기존 프로그램 (Windows Forms)을 에뮬레이션하려고합니다. 이 프로그램은 훨씬 더 큰 데이터 세트를 매우 빠르게 엽니 다. 제 3 자 데이터 그리드 컨트롤을 사용하고 있을지도 모릅니다. 나는 그가 어떻게했는지 저자에게 물어야 할 것이다. – spainchaud

+0

250,000 개의 항목으로 구성된 10 개의 곡선으로 테스트했습니다. 피봇은 500ms가 걸렸다. 순간적으로 그리드가 표시됩니다. 이벤트 (CurveRemoved)에 응답 한 다음 열과 관련된 모든 값을 제거하는 것이 간단해야합니다. – Phil

관련 문제