c# - WPF DataGrid 动态列绑定(bind)

标签 c# wpf mvvm datagrid

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

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

第 2 行和第 3 行将在 runtime 更新每一秒。我的类(class)如下:-
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如下所示(每列需要与模型绑定(bind),而不是行):-

Data Grid

请指导我如何完成它,任何要引用的特定链接都会有很大帮助,我想我必须使用 MVVM .

最佳答案

为了在运行时更新股票价格并添加新股票,Stock应该执行INotifyPropertyChanged并使用 ObservableCollection而不是 List<Stock> .

通过 public property 公开股票列表,从帖子中您还可以了解如何设置 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>

关于c# - WPF DataGrid 动态列绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26463838/

相关文章:

c# - 'ExampleMvvmPhone.ViewModel' 是 'namespace',但用作 'type'

c# - 尝试使用非托管 C++ DLL 时出现 SafeArrayTypeMismatchException

c# - 带菜单的按钮

c# - 在哪里通过代码设置验证错误?

java - MVVM 中的 Activity/Fragment 和 ViewModel 应该做什么

c# - 在应用 Mode-View-ViewModel 设计模式时包括部分 View

c# - TransactionScope 而不是使用锁

c# - 使用 Windows + Shift + 箭头键移动最大化窗口时 Window.Left 错误

c# - 如何从 C# 中的锯齿状数组中删除一列和一行

用于集合的 WPF 数据模板