КСАМЛ:Привязка максимальной длины текстового поля к константе класса

StackOverflow https://stackoverflow.com/questions/232986

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top