2012-01-31 6 views
5

Мой UI:GridViewColumn Регулировка ширины

<ListView Name="persons" SelectionChanged="persons_SelectionChanged"> 
     <ListView.View> 
      <GridView AllowsColumnReorder="False"> 
       <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" Width="auto"/> 
       <GridViewColumn Header="Age" DisplayMemberBinding="{Binding Age}" Width="auto"/> 
      </GridView> 
     </ListView.View> 
    </ListView> 

Codebehind моего интерфейса:

internal void Update(IEnumerable<Person> pers) 
    { 
     this.persons.ItemsSource = null; 
     this.persons.ItemsSource = pers; 
     UpdateLayout(); 
    } 

Мои Сущности:

class Person 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

В GridViewColumns имеют ширину GridViewColumn-заголовка. Даже если я вызываю Update() с людьми с длинным именем. Колонка не изменяется.

a) Как я могу изменить размер «Имя» -колонка автоматически (когда я вызвал обновление) до длины самого длинного имени, но не дольше значения x (я хочу указать максимальную ширину столбца) ?

b) Как я могу указать, что поле «Возраст» заполняет пространство до конца элемента управления (так что столбцы gridview используют полную ширину элемента управления)?

ответ

6

GridView не изменяет размер автоматически.

Чтобы изменить размер столбцов можно

foreach (GridViewColumn c in gv.Columns) 
    { 
     // Code below was found in GridViewColumnHeader.OnGripperDoubleClicked() event handler (using Reflector) 
     // i.e. it is the same code that is executed when the gripper is double clicked 
     // if (adjustAllColumns || App.StaticGabeLib.FieldDefsGrid[colNum].DispGrid) 
     if (double.IsNaN(c.Width)) 
     { 
      c.Width = c.ActualWidth; 
     } 
     c.Width = double.NaN; 
    } 

Что касается размеров последнего, чтобы заполнить область я сделать это с переходником. Я не думаю, что этот конвертер делает именно то, что вам нужно для этого, но он должен вас начать.

<GridViewColumn Width="{Binding ElementName=lvCurDocFields, Path=ActualWidth, Converter={StaticResource widthConverter}, ConverterParameter=100}"> 


    [ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      // value is the total width available 
      double otherWidth; 
      try 
      { 
       otherWidth = System.Convert.ToDouble(parameter); 
      } 
      catch 
      { 
       otherWidth = 100; 
      } 
      if (otherWidth < 0) otherWidth = 0; 

      double width = (double)value - otherWidth; 
      if (width < 0) width = 0; 
      return width; // columnsCount; 

     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 

GridView работает быстро, но требуется немного детского сидения.

+0

Я знаю, что это довольно старый, но я хочу подчеркнуть, насколько важны сроки исправления «ColumnWidth» и что он действительно работает хорошо при правильном применении. Убедитесь, что контейнер GridView загружен и видим. У меня было довольно неприятное сочетание GridView, размещенного внутри расширителя, который, в свою очередь, был частью виртуализирующего родительского элемента управления. Значение, изменение размера при выключенном экране приведет к нулевой ширине, и элементы могут измениться, когда шаблон будет переработан для разных данных. Теперь я доволен своим решением. – grek40

Смежные вопросы