我正在尝试让 ListView 中的 gridviewcolumns 自动调整大小以适应绑定(bind)源更新时的内容( View 模型上的可观察集合)。
ListView 填充正常,但在我刷新/更新集合时不起作用。这是我目前正在尝试的解决方案:
XAML:
<ListView x:Name="ListView" ItemsSource="{Binding Collection, NotifyOnSourceUpdated=True}" SourceUpdated="ListView_SourceUpdated">
<ListView.View>
<GridView>
<GridViewColumn Width="Auto" Header="Test" DisplayMemberBinding={Binding Test}" />
</GridView>
</ListView.View>
</ListView>
代码隐藏:
private void requestsListView_SourceUpdated(object sender, DataTransferEventArgs e)
{
GridView gv = requestsListView.View as GridView;
if (gv != null)
{
foreach (var c in gv.Columns)
{
if (double.IsNaN(c.Width))
{
c.Width = c.ActualWidth;
}
c.Width = double.NaN;
}
}
}
据我所知,SourceUpdated 事件永远不会触发。不知道是不是因为datacontext设置成了ViewModel?不确定如何从 VM 与 ListView 交互。
是否有更好的方法尝试使用 ViewModel 来实现这一点?还是新手,正在尝试学习 MVVM。
最佳答案
这是一个工作示例:
<Window x:Class="ListViewAutoResize.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<ListView x:Name="lv" Background="Beige" ItemsSource="{Binding items}" >
<ListView.View>
<GridView>
<GridViewColumn Header="Column1" DisplayMemberBinding="{Binding}"/>
<GridViewColumn Header="Column2" DisplayMemberBinding="{Binding}"/>
<GridViewColumn Header="Column3" DisplayMemberBinding="{Binding}"/>
</GridView>
</ListView.View>
</ListView>
<Button Content="Add item" Click="btnAddItem_OnClick"/>
</StackPanel>
</Window>
这是代码隐藏:
public partial class MainWindow : Window
{
public ObservableCollection<string> items { get; set; }
public MainWindow()
{
InitializeComponent();
items = new ObservableCollection<string>();
items.Add(("item1"));
items.Add(("item2"));
items.Add(("item3333"));
items.Add(("item4"));
items.Add(("item5"));
items.CollectionChanged += items_CollectionChanged;
this.DataContext = this;
}
void items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
var view = lv.View as GridView;
AutoResizeGridViewColumns(view);
}
static void AutoResizeGridViewColumns(GridView view)
{
if (view == null || view.Columns.Count < 1) return;
// Simulates column auto sizing
foreach (var column in view.Columns)
{
// Forcing change
if (double.IsNaN(column.Width))
column.Width = 1;
column.Width = double.NaN;
}
}
private void btnAddItem_OnClick(object sender, RoutedEventArgs e)
{
items.Add("aaaaaaaaaabbbbbbb");
}
}
就是这样。
之前:
之后:
关于c# - 内容更新时自动调整 Listview 列的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18389675/