Подтвердить что ты не робот

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}" />

Любая помощь приветствуется.

Большое спасибо

4b9b3361

Ответ 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. вы не можете привязываться к типам в этом случае, только к существующим объектам. но один и два являются типами, а не объектами.