Привязка к ширине колонны

Мне нужен какая-то таблица для ввода пользователя. Поэтому я создал сетку с определенными колоннами и рядами. Стол не должен показывать данные, это предназначено только для структурирования входов.

Для структурирования всех элементов, таких как текстовые поля и т. Д. Я определил все столбцы с шириной. Там будет несколько решеток, выровненных в стекпане.

Определения столбцов в XAML выглядит как:

<Grid.ColumnDefinitions>
  <ColumnDefinition x:Name="widthLoopID" Width="55" />
</Grid.ColumnDefinition>

Я ссылался на то, что из других сетков, таких как:

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="{Binding ElementName=widthLoopID, Path=Width}" />
</GridColumnDefinition>

, которая работает довольно хорошо.

Теперь сложная часть. Как мне сделать это в коде-позади?

Я попробовал следующее:

// define columns
ColumnDefinition loopIdColumn = new ColumnDefinition();
// setup databinding for columns
Binding loopIdBinding = new Binding();
// set binding for width
loopIdBinding.ElementName = "widthLoopID";
loopIdBinding.Path = new PropertyPath("Width");
loopIdColumn.SetBinding(Grid.WidthProperty, loopIdBinding);
// add definition of column
loopGrid.ColumnDefinitions.Add(loopIdColumn);

, но при выполнении я получаю следующую ошибку

System.Windows.Data Error: 1 : Cannot create default converter to perform 'one-way' conversions between types 'System.Windows.GridLength' and 'System.Double'. Consider using Converter property of Binding. BindingExpression:Path=Width; DataItem='ColumnDefinition' (HashCode=37457626); target element is 'ColumnDefinition' (HashCode=7871588); target property is 'Width' (type 'Double')

System.Windows.Data Error: 5 : Value produced by BindingExpression is not valid for target property.; Value='55' BindingExpression:Path=Width; DataItem='ColumnDefinition' (HashCode=37457626); target element is 'ColumnDefinition' (HashCode=7871588); target property is 'Width' (type 'Double')

, поэтому мне нужно преобразовать «ширину», но как мне это сделать и почему Невозможно выполнить конвертер по умолчанию, так как он делает в XAML?

Я довольно новичок в WPF и, возможно, не понял каждую концепцию, поэтому, пожалуйста, дайте мне намек.

заранее спасибо Бенни

Редактировать:

Я попробовал намек на первый ответ. Это не работает, потому что GridlengthConverter не от типа Ivalueconverter.

Итак, я написал DoubletoGridLengthConverter, который преобразует съемку в двойную и наоборот.

Теперь значение преобразуется, но результат не совпадает с тем, что код делает в XAML. У меня есть ощущение, что вообще не работает от кода позади. Действительно странно.

Вот код преобразователя:

using System;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;
using System.Globalization;
using System.Diagnostics;

namespace editor
{
   [ValueConversion(typeof(Double), typeof(GridLength))]
   class DoubleToGridLengthConverter : IValueConverter
   {
       public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
       {
           // check whether a value is given
           if (value != null)
           {
              Debug.WriteLine("value is: " + value + " type: " + value.GetType());
              return (Double)((GridLength)(value)).Value;
           }
           else
           {
               throw new ValueUnavailableException();
           }
       }

       public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
       {
           // check whether a value is given
           if (value != null)
           {
               return new GridLength((Double)value);
           }
           else
           {
               throw new ValueUnavailableException();
           }
        }
    }
}

Любые дальнейшие подсказки? Я могу представить, что у кого-то еще уже имел эту проблему.

Спасибо снова Бенни

5
задан H.B. 5 September 2011 в 19:15
поделиться