WPF DataGrid动态列绑定

时间:2014-10-20 10:51:16

标签: c# wpf mvvm datagrid

我是WPF的新手,遇到了一个问题。我正在使用DataGrid行修复(只有3行)但可以在运行时添加列。

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

1 个答案:

答案 0 :(得分: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,正如迈克在评论中所建议的那样,或者 - 这是学习WPF的一个有趣的部分 - 您通过应用RotateTransform来旋转DataGrid。

在我的代码示例中,我定义了2个DataGrid,一个是正常的,一个是90度旋转。代码已从another post修改。您需要使用DataGrid.ColumnHeaderStyleDataGrid.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>