【问题标题】:Autoresize Listview Columns on content update内容更新时自动调整 Listview 列的大小
【发布时间】:2013-08-22 19:53:51
【问题描述】:

我正在尝试让列表视图中的 gridviewcolumns 在更新 Binding 源(视图模型上的 observablecollection)时自动调整为内容。

列表视图可以正常填充,但在我刷新/更新集合时无法正常工作。这是我目前正在尝试的解决方案:

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。

【问题讨论】:

    标签: c# wpf listview mvvm


    【解决方案1】:

    这是一个工作示例:

    <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");
        }
    }
    

    就是这样。

    之前:

    之后:

    【讨论】:

      【解决方案2】:

      SourceUpdated 事件永远不会触发,因为您从未更改属性 Collection 的值,或者不会通知属性 Collection。您通过 Binding 在 xaml 中设置一次,但集合中内容的更改不会触发事件 SourceUpdate。

      你正确地使用了实现接口 INotifyCollectionChanged 的 ObservableCollection。因此,您可以在该集合上挂钩事件 CollectionChanged

      【讨论】:

      • 对不起 - 我想我的意思是暗示它,但我可以在必要时包含代码。我在 ViewModel 上有一个 ObservableCollection (Collection),它是上述视图的 DataContext。我还有一个与命令相关联的按钮,该命令用新数据重新填充 ObservableCollection(集合),这在 ListView 中反映没有问题。如果我应该包含此代码,请告诉我,但我认为它不相关,因为它是标准的并且可以正常工作。
      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多