如果我使用自动增长列创建一个简单的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;
}
}
}
答案 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列剩下的空间?你会用转换器做到这一点。