views:

2401

answers:

5

I am attempting to bind a WPF textbox's Maxlength property to a known constant deep within a class. I am using c#.

The class has a structure not too dissimilar to the following:

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;
                 }
             }
        }
    }
}

Yes it is deeply nested, but unfortunately in this instance I can't move things round very much without huge rewrites required.

I was hoping I'd be able to bind the textbox MaxLength to the Length1 or Length2 values but I can't get it to work.

I was expecting the binding to be something like the following:

<Textbox Text="{Binding Path=MyBindingValue}" MaxLength="{Binding Path=Blah.One.Two.MetaData.Sizes.Length1}" />

Any help is appreciated.

Many thanks

A: 

try to bind with x:Static. add a xmlns:local namespace with the namespace of Sizes to your xaml header and then bind with something like this:

{x:Static local:Sizes.Length1}
Joachim Kerschbaumer
A: 

Unfortunately, with the following I get the error Type 'One.Two.MetaData.Sizes' not found. I cannot create a local namespace deeper than "Blah" (well according to VS2008 anyway)

xmlns:local="clr-namespace:Blah"

and

MaxLength="{x:Static local:One.Two.MetaData.Sizes.Length1}"
Ash
A: 

if One is not a static class you cannot bind to it with x:Static. why using inner classes? if metadata is outside of two, and Sizes is a property, you can easily access it with x:Static. you cannot bind to types in this case, only to existing objects. but One and Two are types, not objects.

Joachim Kerschbaumer
+6  A: 
MaxLength="{x:Static local:One+Two+MetaData+Sizes.Length1}"

Periods reference properties. Plus signs refer to inner classes.

stusmith
This was useful information! But I do not have enough reputation to click it up yet!
Ash
+2  A: 

Fixed!

Initially I tried doing this:

{Binding Path=MetaData+Sizes.Length1}

which compiled ok, however the binding failed at runtime, despite the Class 'Two' being the datacontext the path couldn't resolve into the inner static classes (could I have done something like : {Binding Path={x:Static MetaData+Size.Length1}} ?)

I had to fiddle with the layout of my classes a little but the binding is now working.

New class structure:

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; }
        }
    }
}

Then my binding statement is as follows:

xmlns:local="clr-namespace:Blah"

and

MaxLength="{x:Static local:MetaData+Sizes.Length1}"

Which appears to work ok. I'm not sure whether or not the constants needed to be converted into properties, but there doesn't appear to be any harm in doing so.

Thankyou everyone for your help!

Ash