Я пытаюсь привязать свойство Maxlength текстового поля WPF к известной константе в глубине класса. Я использую C#.
Класс имеет структуру, не слишком отличающуюся от следующей:
namespace Blah
{
public partial class One
{
public partial class Two
{
public string MyBindingValue { get; set; }
public static class MetaData
{
public static class Sizes
{
public const int Length1 = 10;
public const int Length2 = 20;
}
}
}
}
}
Да, он глубоко вложен, но, к сожалению, в этом случае я не могу сильно перемещать вещи без необходимости огромной перезаписи.
Я надеялся, что смогу привязать текстовое поле MaxLength к значениям Length1 или Length2, но я не могу заставить его работать.
Я ожидал, что привязка будет примерно такой:
<Textbox Text = "{Binding Path=MyBindingValue}" MaxLength = "{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" />
Любая помощь приветствуется.
Большое спасибо





попробуйте связать с x: Static. добавьте пространство имен xmlns: local с пространством имен Sizes в заголовок xaml, а затем выполните привязку примерно так:
{x:Static local:Sizes.Length1}
К сожалению, при следующем я получаю ошибку Type 'One.Two.MetaData.Sizes' not found. Я не могу создать локальное пространство имен глубже, чем "Blah" (в любом случае, согласно VS2008)
xmlns:local = "clr-namespace:Blah"
и
MaxLength = "{x:Static local:One.Two.MetaData.Sizes.Length1}"
если One не является статическим классом, вы не можете привязаться к нему с помощью x: Static. зачем использовать внутренние классы? если метаданные находятся за пределами двух, а размеры - это свойство, вы можете легко получить к ним доступ с помощью x: Static. в этом случае вы не можете выполнять привязку к типам, а только к существующим объектам. но Один и Два - это типы, а не объекты.
MaxLength = "{x:Static local:One+Two+MetaData+Sizes.Length1}"
Свойства ссылок на периоды. Знаки плюс относятся к внутренним классам.
Для меня тоже очень полезно. Спасибо Стусмит
Зафиксированный!
Первоначально я пробовал это сделать:
{Binding Path=MetaData+Sizes.Length1}
который скомпилировался нормально, однако привязка не удалась во время выполнения, несмотря на то, что Class 'Two' был контекстом данных, путь не мог разрешиться во внутренние статические классы (мог бы я сделать что-то вроде: {Binding Path = {x: Static MetaData + Size .Length1}}?)
Мне пришлось немного повозиться с макетом моих классов, но теперь привязка работает.
Новая структура классов:
namespace Blah
{
public static class One
{
// This metadata class is moved outside of class 'Two', but in this instance
// this doesn't matter as it relates to class 'One' more specifically than class 'Two'
public static class MetaData
{
public static class Sizes
{
public static int Length1 { get { return 10; } }
public static int Length2 { get { return 20; } }
}
}
public partial class Two
{
public string MyBindingValue { get; set; }
}
}
}
Тогда мое обязательное заявление выглядит следующим образом:
xmlns:local = "clr-namespace:Blah"
и
MaxLength = "{x:Static local:MetaData+Sizes.Length1}"
Что, похоже, работает нормально. Я не уверен, нужно ли преобразовывать константы в свойства, но, похоже, в этом нет никакого вреда.
Спасибо всем за помощь!
Это была полезная информация! Но у меня пока недостаточно репутации, чтобы на нее нажимать!