КСАМЛ:Привязка максимальной длины текстового поля к константе класса
Вопрос
Я пытаюсь привязать свойство Maxlength текстового поля WPF к известной константе глубоко внутри класса.Я использую С#.
Класс имеет структуру, не слишком отличающуюся от следующей:
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 к значениям длины1 или длины2, но не могу заставить его работать.
Я ожидал, что привязка будет примерно следующей:
<Textbox Text="{Binding Path=MyBindingValue}" MaxLength="{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" />
Любая помощь приветствуется.
Большое спасибо
Решение 2
Зафиксированный!
Сначала я пытался сделать это:
{Binding Path=MetaData+Sizes.Length1}
который скомпилировался нормально, однако привязка не удалась во время выполнения, несмотря на то, что класс «Два» является контекстом данных, путь не может быть преобразован во внутренние статические классы (могу ли я сделать что-то вроде:{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}"
Кажется, работает нормально.Я не уверен, нужно ли конвертировать константы в свойства, но, похоже, в этом нет никакого вреда.
Спасибо всем за вашу помощь!
Другие советы
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}"
Свойства ссылок на периоды. Знаки плюса относятся к внутренним классам.
попробуйте связать с x: Static. добавьте пространство имен xmlns: local с пространством имен Sizes в заголовок xaml, а затем привяжите что-то вроде этого:
{x:Static local:Sizes.Length1}
К сожалению, со следующим сообщением я получаю ошибку Type 'One.Two.MetaData.Sizes' not found
.Я не могу создать локальное пространство имен глубже, чем «Бла» (во всяком случае, согласно VS2008)
xmlns:local="clr-namespace:Blah"
и
MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}"
если One не является статическим классом, вы не можете связать его с x: Static. зачем использовать внутренние классы? если метаданные находятся за пределами двух, а Sizes - это свойство, вы можете легко получить к нему доступ с помощью x: Static. в этом случае вы не можете связывать типы, только существующие объекты. но Один и Два являются типами, а не объектами.