繁体   English   中英

C# WPF - 控制 DataGrid ItemsSource 项目的列宽

[英]C# WPF - Controlling column width of DataGrid ItemsSource items

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

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

在此处输入图片说明

在图片中它显示了 4 列,来自 ItemsSource 的“Title”和“Price”都是 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 或任何东西也会很棒。

谢谢!

我通过绑定到我想在列中显示的对象的字段来解决这个问题。 这意味着我可以删除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>

我感谢人们花时间查看问题 - 如果我浪费了你的时间,抱歉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM