Мне нужен какая-то таблица для ввода пользователя. Поэтому я создал сетку с определенными колоннами и рядами. Стол не должен показывать данные, это предназначено только для структурирования входов.
Для структурирования всех элементов, таких как текстовые поля и т. Д. Я определил все столбцы с шириной. Там будет несколько решеток, выровненных в стекпане.
Определения столбцов в 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();
}
}
}
}
Любые дальнейшие подсказки? Я могу представить, что у кого-то еще уже имел эту проблему.
Спасибо снова Бенни