A sample for the holidays


For my last task of the year, I answered a question about binding a ComboBox to a collection of StrokeCollections that has a custom property to indicate the name of the StrokeCollection.  This was a fun little project so I decided to post it here to share.  My solution was to inherit from StrokeCollection and expose the name as a property.


    public class NamedStrokeCollection : StrokeCollection


    {


        Guid nameGuid = new Guid(“12345678-9012-3456-7890-123456789012”);


 


        #region constructers that mirror StrokeCollection


        public NamedStrokeCollection()


            : base()


        {


        }


 


        public NamedStrokeCollection(IEnumerable<Stroke> strokes)


            : base(strokes)


        {


        }


 


        public NamedStrokeCollection(System.IO.Stream stream)


            : base(stream)


        {


        }


        #endregion


 


 


        public NamedStrokeCollection(string name)


            : base()


        {


            Name = name;


        }


 


        public NamedStrokeCollection(IEnumerable<Stroke> strokes, string name)


            : base(strokes)


        {


            Name = name;


        }


 


        public NamedStrokeCollection(System.IO.Stream stream, string name)


            : base(stream)


        {


            Name = name;


        }


 


         


        // StrokeCollection doesn’t have a constructor that takes an ISF, so


        // since that’s the easiest way for *me* to create a stroke collection is to pass in


        // an ISF string, I created a static method to return a NamedStrokeCollection


        // when it’s passed in a string.


        static public NamedStrokeCollection GetStrokes(string strokesStr, string name)


        {


            // Create a StrokeCollection the string and add it to


            StrokeCollectionConverter converter =


                new StrokeCollectionConverter();


 


            StrokeCollection strokes = converter.ConvertFrom(strokesStr) as StrokeCollection;


            NamedStrokeCollection namedStrokes = new NamedStrokeCollection(strokes);


            namedStrokes.Name = name;


 


            return namedStrokes;


        }


 


        public string Name


        {


            get


            {


                if (this.ContainsPropertyData(nameGuid))


                {


                    return (string)this.GetPropertyData(nameGuid);


                }


                else


                {


                    return “”;


                }


            }


 


            set


            {


                this.AddPropertyData(nameGuid, value);


            }


 


        }


    }


 


After that, it’s easy to create an ObservableCollection<NamedStrokeCollection> class, populate an object with NamedStokeCollections, and Bind to the object just as you would for any other object.


      <Window.Resources>


            <src:StrokesCollection x:Key=”strokes”/>


      </Window.Resources>  


      <StackPanel>


            <ComboBox Name=”cb1″ ItemsSource=”{StaticResource strokes}”


                          DisplayMemberPath=”Name” SelectedIndex=”0″>


            </ComboBox>


            <InkCanvas Name=”ic1″ Strokes=”{Binding ElementName=cb1, Path=SelectedItem}”/>     


      </StackPanel>


 


Pretty slick, huh?  I’ve attached to sample for your convenience.


Happy Holidays and see you next year!


Carole

BindingStrokeCollectionCustomProperty.zip


Comments (1)

  1. Alex Mikunov says:

    Dude, stop misleading people. Better show how to implement RichTextBox Control in *pure* WPF, w/o subclassing from Windows Common Controls DLL

    (I mean CommCtl32.dll and RICHEDIT_CLASS)