我是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
,如下所示(其中每列需要与模型绑定,而不是行): -
请指导我如何完成任务,任何具体的参考链接都将是一个很大的帮助,我想我必须使用MVVM
。
答案 0 :(得分:3)
为了更新股票价格并在运行时添加新股票,Stock
应实施INotifyPropertyChanged并使用ObservableCollection代替List<Stock>
。
通过public property公开库存清单,您也可以在帖子中了解如何设置DataGrid的DataContext
和ItemsSource
。这就是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.ColumnHeaderStyle
,DataGrid.LayoutTransform
和DataGrid.CellStyle
来旋转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>