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
- Anonymous
January 13, 2008
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)