【问题标题】:C# WPF - Controlling column width of DataGrid ItemsSource itemsC# WPF - 控制 DataGrid ItemsSource 项的列宽
【发布时间】:2021-01-04 10:53:42
【问题描述】:

这个问题很难解释,但我会尽力而为。此代码是我正在开发的网络抓取应用程序的概念验证的一部分 - 只是最近才开始。

我正在尝试使用 DataGrid 显示 2 列数据。我可以通过将ObservableCollection<> 分配给DataGrid.ItemsSource 来显示数据(见下图),我遇到的问题是我无法控制列属性。我对 WPF 很陌生,并试图“有点”采用 MVVM。

在图片中它显示了 4 列,ItemsSource 中的“标题”和“价格”都是 2 个大列。

private void ScrapeProductButton_OnClick(object sender, RoutedEventArgs e)
{
    string url = this.ProductToScrapeUrlTextBox.Text;
    scraper.ScrapeData(url);
    
    var entries = scraper.Entries;
    WebScrapedItems.ItemsSource = entries;
    
    WebScrapedItems.Columns.Add(new DataGridTextColumn(){Header = "Title",
        Width = new DataGridLength(0.8, DataGridLengthUnitType.Star)});
    WebScrapedItems.Columns.Add(new DataGridTextColumn(){Header = "Price",
        Width = new DataGridLength(0.2, DataGridLengthUnitType.Star)});
}

如上面后面的代码所示,我尝试添加 2 列的正确格式,假设 ItemsSource 的内容只会做同样的事情(显然不是)。在 XAML 中关闭 AutoGeneratedColumns 不会显示 ItemsSource,但会正确显示其他列。

<StackPanel>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="3*"/>
        </Grid.ColumnDefinitions>
        <Button Name="ScrapeProductButton" Grid.Column="0"
            Margin="10 10 10 10" Background="AntiqueWhite"
            Content="Scrape Website" FontWeight="Bold"
            Click="ScrapeProductButton_OnClick"/>
        <TextBox Name="ProductToScrapeUrlTextBox" Grid.Column="1"
            Margin="10" Padding="2"/>
    </Grid>

    <DataGrid Height="350" Width="740" Margin="10" Name="WebScrapedItems"
        VerticalAlignment="Center" HorizontalAlignment="Center"
        RowHeight="30" ColumnWidth="390" IsReadOnly="True"
        AutoGenerateColumns="True" FrozenColumnCount="2">
    </DataGrid>

</StackPanel>

我的目标是只显示 ItemsSource 对象的内容,但要确保它们的格式正确。我觉得绑定可能是它无法正常工作的一个潜在原因,但我还是 WPF 的新手,还没有开始阅读它。

任何帮助将不胜感激,任何 WPF 建议、MVVM 或任何东西也将非常好。

谢谢!

【问题讨论】:

    标签: c# wpf data-binding datagrid


    【解决方案1】:

    我通过绑定到我想在列中显示的对象的字段解决了这个问题。这意味着我可以删除ScrapeProductButton_OnClick 方法中的格式。

    XAML 代码在这里:

    <StackPanel>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <Button Name="ScrapeProductButton" Grid.Column="0" Margin="10 10 10 10" Background="AntiqueWhite" Content="Scrape Website" FontWeight="Bold" Click="ScrapeProductButton_OnClick"/>
            <TextBox Name="ProductToScrapeUrlTextBox" Grid.Column="1" Margin="10" Padding="2"/>
        </Grid>
    
            <DataGrid Name="WebScrapedItems" AutoGenerateColumns="False">
                <DataGrid.Columns >
                    <DataGridTextColumn Header="Title" Binding="{Binding Title}" Width="3*"/>
                    <DataGridTextColumn Header="Price" Binding="{Binding Price}" Width="*"/>
                </DataGrid.Columns>
            </DataGrid>
    </StackPanel>
    

    感谢人们花时间解决问题 - 很抱歉浪费了您的时间。

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2014-10-05
      • 1970-01-01
      • 2011-08-23
      • 2011-08-22
      • 2013-04-21
      • 2013-06-30
      • 2012-10-30
      • 1970-01-01
      相关资源
      最近更新 更多