c# - 内容更新时自动调整 Listview 列的大小

标签 c# wpf listview mvvm

我正在尝试让 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");
    }
}

就是这样。

之前:

enter image description here

之后:

enter image description here

关于c# - 内容更新时自动调整 Listview 列的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18389675/

相关文章:

android - 在android中的ListView上显示不同的图标

android - 如何异步填充 ListView ?

c# - 自动生成的数据网格中的日期时间转换器

c# - 在 linq to entities where 子句中建立两个列表之间的链接

c# - 从 SelectListItem 获取选定的值

c# - Tablet WPF Windows 桌面应用程序 - 滚动问题

wpf - 如何将 TargetNullValue 设置为日期?

c# - 我可以将 Int.TryParse 更改为在解析不成功时返回 -1 而不是零吗?

wpf - SpeechSynthesizer 音频到文本作为它的口语

c# - 如何在 .net 3.5 中禁用 ListView 控件中的项目