2013-08-22 2 views
2

Я пытаюсь получить gridviewcolumns в listview для автоматического размера для контента, когда обновляется источник привязки (наблюдаемый коллектив на модели просмотра).Autoresize Listview Columns on content update

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> 

Codebehind:

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? Не знаете, как взаимодействовать с ListView с виртуальной машины.

Есть ли лучший способ попытаться сделать это с помощью ViewModel? Еще новичок и пытается узнать MVVM.

ответ

0

ИсточникОбнованное событие никогда не срабатывает, потому что вы никогда не меняли стоимость имущества Коллекция или свойство Collection не сообщается. Вы устанавливаете его один раз в xaml посредством Binding, но изменения содержимого в коллекции не запускают событие SourceUpdate.

Вы правильно используете ObservableCollection, который реализует интерфейс INotifyCollectionChanged. Таким образом, вы можете подключить событие CollectionChanged в этой коллекции.

+0

К сожалению - я предполагаю, что я имел в виду, это, но я могу включить код, если это необходимо. У меня есть ObservableCollection (Collection) в ViewModel, который является DataContext вышеуказанного представления. У меня также есть кнопка, привязанная к команде, которая повторно заполняет ObservableCollection (коллекция) новыми данными, которые не отображаются в ListView без проблем. Если я должен включить этот код, дайте мне знать, но я не думаю, что это было актуально, поскольку оно стандартно и работает без проблем. – ctd25

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

И вот об этом.

До:

enter image description here

После:

enter image description here

+0

Он отметил МВВМ. это не MVVM ... – MistaGoustan