WPF ListView自动增长列

时间:2014-08-06 12:01:01

标签: c# .net wpf listview autogrow

如果我使用自动增长列创建一个简单的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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

listview的datacontext是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;
    }

虽然如果你有空闲时间,我强烈建议你学习数据绑定。

答案 1 :(得分:0)

我也看到过这种行为。它只会调整第一个屏幕涂料的尺寸。每种油漆的尺寸都要花费很多。如果用户调整了列的大小,他们可能不知道改变了什么。为什么不直接给第2列剩下的空间?你会用转换器做到这一点。