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