0

如果我创建一个带有自动增长列的简单 ListView,它只会自动增长添加的第一个“批次”项目。为什么会发生这种情况,有什么办法可以解决吗?

我已经尝试过使用 ObservableCollection(显示示例),并手动将项目添加到 LstItems.Items,行为相同。第一次单击 BtnAdd 时,它会按预期自动增长,但随后不会。

XAML:

    <ListView Margin="12,12,12,41" Name="LstItems">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="Row 1" DisplayMemberBinding="{Binding Path=Col1}" />
                <GridViewColumn Width="Auto" Header="Row 2" DisplayMemberBinding="{Binding Path=Col2}" />
            </GridView>
        </ListView.View>
    </ListView>

代码:

public partial class Window1 : Window
{
    private readonly ObservableCollection<MyData> _data = new ObservableCollection<MyData>();

    private const int NumRepeats = 2;
    private const int EnumerationIncrement = 3;

    private int _enumerationCount = 3;

    public Window1()
    {
        InitializeComponent();
        LstItems.ItemsSource = _data;
    }

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
    }
}
4

2 回答 2

1

您列表视图的数据上下文是 1 个单项(MyData) 我猜这是偶然的?您应该离开 datacontext 并将 Listview 的 itemSource 绑定到 _data

XAML

 <ListView Margin="12,12,12,41" Name="LstItems" ItemSource="{Binding _data}">
        <ListView.View>
            <GridView>
                <GridViewColumn Width="100" Header="Row 1" DisplayMemberBinding="{Binding Path=Col1}" />
                <GridViewColumn Width="Auto" Header="Row 2" DisplayMemberBinding="{Binding Path=Col2}" />
            </GridView>
        </ListView.View>
    </ListView>

代码:

public partial class Window1 : Window
{
    public ObservableCollection<MyData> _data = new ObservableCollection<MyData>();

    private const int NumRepeats = 2;
    private const int EnumerationIncrement = 3;

    private int _enumerationCount = 3;

    public Window1()
    {
        InitializeComponent();
    }

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
    }
}

我还刚刚发现了您的代码无法按预期工作的主要原因。您正在 Window1 构造函数中推送 LstItems.ItemsSource。您没有绑定 ItemSource。因此,当 _data 更新时,ItemSource 不知道它。在不了解 DataBinding 的情况下,也许对您来说一个快速的解决方案是:

    private void BtnAdd_Click(object sender, RoutedEventArgs e)
    {
        for (int i = 1; i <= NumRepeats; i++)
        {
            string data = String.Join(", ", Enumerable.Repeat("Test Data", _enumerationCount));
            _data.Add(new MyData { Col1 = "Test", Col2 = data });
            _enumerationCount += EnumerationIncrement;
        }
        LstItems.ItemSource = _data;
    }

尽管如果您有空闲时间,我强烈建议您学习数据绑定。

于 2014-08-06T13:02:12.543 回答
0

我也看到了这种行为。它只调整第一个屏幕油漆的大小。调整每种油漆的尺寸会产生很多开销。如果用户调整了列的大小,他们可能不会改变它。为什么不把剩下的空间留给第 2 列呢?你可以用转换器来做到这一点。

于 2014-08-06T22:16:12.640 回答