2014-10-20 78 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