2014-10-20 90 views
0

我是WPF的新手,並且遇到了一個問題。我正在使用DataGrid,其中行是固定的(只有3行),但列可以在運行時添加。WPF DataGrid Dymanic Column binding

Row 1 :- Stock Name 
Row 2 :- Current Price 
Row 3 :- Old Price 

並且第2行和第3行將每秒更新爲runtime。我有類,如下: -

class Stock 
{ 
String name; 
double currentPrice; 
double oldPrice; 
} 

class StockCollaction 
{ 

List<Stock> list = new List<Stock>(); 

public void addStock(Stock stock) 
{ 
list.add(stock); 
} 

public void update() 
{ 
.... 
} 
..... 
} 

我想創建DataGrid像下面(其中每列需要與模型結合,而不是行): -

Data Grid

請指導我如何我可以做到這一點,任何具體的鏈接將提供很大的幫助,我想我必須使用MVVM

+0

這確實不適合與內置'DataGrid'的設計。一些第三方網格可能支持這樣的「倒轉」軸。關於我的頭頂,我認爲DevExpress網格確實如此。 – 2014-10-20 13:25:13

回答

3

爲了更新股票價格並在運行時添加新股票,Stock應執行INotifyPropertyChanged並使用ObservableCollection而不是List<Stock>

通過public property公開股票列表,您也可以瞭解如何設置DataGrid的DataContextItemsSource。這就是StockCollection class看起來像

public class StockCollection 
{ 
    private ObservableCollection<Stock> stocks; 
    public ObservableCollection<Stock> Stocks 
    { 
     get 
     { 
      return stocks; 
     } 
    } 
    //...add(), update() and other methods/properties 
} 

現在的XAML代碼。

使用內置的DataGrid您添加新行,而不是股票的新列。您可以找到第三方DataGrid支持倒置軸,如Mike在他的評論中所建議的那樣,或者 - 在學習WPF時這是一個有趣的部分 - 通過應用RotateTransform來旋轉DataGrid。

在我的代碼示例中,我定義了2個DataGrid,一個是正常的,一個是旋轉90度。代碼從another post修改。你需要玩DataGrid.ColumnHeaderStyle,DataGrid.LayoutTransformDataGrid.CellStyle來旋轉DataGrid。

rotated DataGrid

<StackPanel Margin="100"> 
      <DataGrid x:Name="dataGrid1" Width="200" Height="120" AutoGenerateColumns="False" 
        ItemsSource="{Binding Stocks}" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top" 
        HorizontalScrollBarVisibility="Hidden" 
        VerticalScrollBarVisibility="Hidden"> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Old Price" Binding="{Binding Path=OldPrice}"/> 
        <DataGridTextColumn Header="Current Price" Binding="{Binding Path=CurrentPrice}"/> 
        <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}" Width="*"/> 
       </DataGrid.Columns> 
      </DataGrid> 
      <Grid Height="100"></Grid> 
      <DataGrid x:Name="dataGrid2" Width="100" Height="500" AutoGenerateColumns="False" 
        ItemsSource="{Binding Stocks}" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top" 
        HorizontalScrollBarVisibility="Hidden" 
        VerticalScrollBarVisibility="Hidden"> 
       <DataGrid.ColumnHeaderStyle> 
        <Style TargetType="{x:Type DataGridColumnHeader}"> 
         <Setter Property="LayoutTransform"> 
          <Setter.Value> 
           <TransformGroup> 
            <RotateTransform Angle="90"/> 
           </TransformGroup> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="Width" Value="120"/> 
         <Setter Property="Height" Value="30"/> 
        </Style> 
       </DataGrid.ColumnHeaderStyle> 
       <DataGrid.LayoutTransform> 
        <TransformGroup> 
         <RotateTransform Angle="-90"/> 
        </TransformGroup> 
       </DataGrid.LayoutTransform> 
       <DataGrid.CellStyle> 
        <Style TargetType="{x:Type DataGridCell}"> 
         <Setter Property="LayoutTransform"> 
          <Setter.Value> 
           <TransformGroup> 
            <RotateTransform Angle="90"/> 
           </TransformGroup> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="Width" Value="120"/> 
         <Setter Property="Height" Value="30"/> 
        </Style> 
       </DataGrid.CellStyle> 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Old Price" Binding="{Binding OldPrice}" /> 
        <DataGridTextColumn Header="Current Price" Binding="{Binding CurrentPrice}"/> 
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
       </DataGrid.Columns> 
      </DataGrid> 
     </StackPanel> 
+0

感謝對於答案,我認爲這應該可以正常工作,但我需要爲第1行自定義高度,因爲我需要在那顯示圖像。你能指導我如何爲行設置不同的高度嗎? – 2014-10-22 10:41:31

+0

你需要用'DataTemplate'玩。我已經上傳了一個[演示項目](http://1drv.ms/1tKHz46)供您使用。 – kennyzx 2014-10-22 11:56:55

+0

這是驚人的幫助,非常感謝。 – 2014-10-22 13:13:00