XAML: привязка максимальной длины текстового поля к константе класса

Я пытаюсь привязать свойство 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}" />

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
0
9 278
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

попробуйте связать с 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}"

Свойства ссылок на периоды. Знаки плюс относятся к внутренним классам.

Это была полезная информация! Но у меня пока недостаточно репутации, чтобы на нее нажимать!

Ash 24.10.2008 16:44

Для меня тоже очень полезно. Спасибо Стусмит

ganeshran 17.05.2011 12:58
Ответ принят как подходящий

Зафиксированный!

Первоначально я пробовал это сделать:

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

Что, похоже, работает нормально. Я не уверен, нужно ли преобразовывать константы в свойства, но, похоже, в этом нет никакого вреда.

Спасибо всем за помощь!

Другие вопросы по теме