Мне нужна какая-то таблица для пользовательского ввода. Поэтому я создал сетку с определенными столбцами и строками.
Таблица не для отображения данных, ее цель - просто структурировать входные данные.
Чтобы структурировать все элементы, такие как текстовые поля и т. Д., Я определил все столбцы с шириной. В стековой панели будет несколько совмещенных сеток.
Определения столбцов в 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 и, возможно, не понял всех понятий, поэтому, пожалуйста, дайте мне подсказку.
Спасибо заранее
Бенни
EDIT:
Я попробовал намек на первый ответ. Это не работает, потому что GridLengthConverter не относится к типу IValueConverter.
Итак, я написал DoubleToGridLengthConverter, который преобразует GridLength в Double и наоборот.
Теперь значение конвертируется, но результат не совпадает с результатом, который код делает в 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();
}
}
}
}
Есть еще какие-нибудь намеки? Я могу представить, что кто-то еще уже имел эту проблему.
Еще раз спасибо
Benny