XAML: привязка максимальной длины текстового поля к константе класса - PullRequest
18 голосов
/ 24 октября 2008

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

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

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

Ответы [ 5 ]

38 голосов
/ 24 октября 2008
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}"

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

6 голосов
/ 24 октября 2008

Исправлено!

Сначала я попытался сделать это:

{Binding Path=MetaData+Sizes.Length1}

, что скомпилировано нормально, однако привязка не удалась во время выполнения, несмотря на то, что класс '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}"

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

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

0 голосов
/ 24 октября 2008

К сожалению, со следующим я получаю ошибку Type 'One.Two.MetaData.Sizes' not found. Я не могу создать локальное пространство имен глубже, чем «Бла» (в любом случае, согласно VS2008)

xmlns:local="clr-namespace:Blah"

и

MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}"
0 голосов
/ 24 октября 2008

если One не является статическим классом, вы не можете связать его с x: Static. зачем использовать внутренние классы? если метаданные находятся за пределами двух, а Sizes - это свойство, вы можете легко получить к нему доступ с помощью x: Static. в этом случае вы не можете связывать типы, только существующие объекты. но Один и Два являются типами, а не объектами.

0 голосов
/ 24 октября 2008

попробуйте связать с x: Static. добавьте пространство имен xmlns: local с пространством имен Sizes в заголовок xaml, а затем привяжите что-то вроде этого:

{x:Static local:Sizes.Length1}
...