From 1bd46e23b3ad4a8d583e1cdc116ec93828482dfc Mon Sep 17 00:00:00 2001 From: Beatriz Stollnitz Date: Mon, 5 Aug 2019 17:42:12 -0700 Subject: [PATCH] Added 15th post. --- .../DataSource.cs | 76 ++++++++++++ .../GroupingTreeView.5.0.resharper.user | 11 ++ .../GroupingTreeView.csproj | 92 ++++++++++++++ .../GroupingTreeView.sln | 20 +++ .../GroupingTreeView.suo | Bin 0 -> 23040 bytes .../MyApp.xaml | 9 ++ .../MyApp.xaml.cs | 17 +++ .../Properties/AssemblyInfo.cs | 54 ++++++++ .../Properties/Resources.Designer.cs | 63 ++++++++++ .../Properties/Resources.resx | 117 ++++++++++++++++++ .../Properties/Settings.Designer.cs | 26 ++++ .../Properties/Settings.settings | 7 ++ .../Window1.xaml | 34 +++++ .../Window1.xaml.cs | 25 ++++ .../15GroupingTreeView/DataSource.cs | 76 ++++++++++++ .../GroupingTreeView.csproj | 79 ++++++++++++ .../15GroupingTreeView/GroupingTreeView.sln | 20 +++ .../15GroupingTreeView/GroupingTreeView.suo | Bin 0 -> 16896 bytes .../15GroupingTreeView/MyApp.xaml | 9 ++ .../15GroupingTreeView/MyApp.xaml.cs | 17 +++ .../Properties/AssemblyInfo.cs | 54 ++++++++ .../Properties/Resources.cs | 70 +++++++++++ .../Properties/Resources.resx | 117 ++++++++++++++++++ .../15GroupingTreeView/Properties/Settings.cs | 42 +++++++ .../Properties/Settings.settings | 7 ++ .../15GroupingTreeView/Window1.xaml | 34 +++++ .../15GroupingTreeView/Window1.xaml.cs | 25 ++++ .../Images/15GroupingTreeView.png | Bin 0 -> 13100 bytes 15-GroupingTreeView/README.md | 36 ++++++ 29 files changed, 1137 insertions(+) create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/DataSource.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.5.0.resharper.user create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.csproj create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.sln create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.suo create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/AssemblyInfo.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.Designer.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.resx create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.Designer.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.settings create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml create mode 100644 15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/DataSource.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.csproj create mode 100644 15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.sln create mode 100644 15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.suo create mode 100644 15-GroupingTreeView/15GroupingTreeView/MyApp.xaml create mode 100644 15-GroupingTreeView/15GroupingTreeView/MyApp.xaml.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/Properties/AssemblyInfo.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/Properties/Resources.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/Properties/Resources.resx create mode 100644 15-GroupingTreeView/15GroupingTreeView/Properties/Settings.cs create mode 100644 15-GroupingTreeView/15GroupingTreeView/Properties/Settings.settings create mode 100644 15-GroupingTreeView/15GroupingTreeView/Window1.xaml create mode 100644 15-GroupingTreeView/15GroupingTreeView/Window1.xaml.cs create mode 100644 15-GroupingTreeView/Images/15GroupingTreeView.png create mode 100644 15-GroupingTreeView/README.md diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/DataSource.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/DataSource.cs new file mode 100644 index 0000000..568663e --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/DataSource.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace GroupingTreeView +{ + public class Animal + { + private string name; + + public string Name + { + get { return name; } + set { name = value; } + } + + private Category category; + + public Category Category + { + get { return category; } + set { category = value; } + } + + public Animal(string name, Category category) + { + this.name = name; + this.category = category; + } + } + + public enum Category + { + Amphibians, + Bears, + BigCats, + Canines, + Primates, + Spiders, + } + + public class Animals + { + private List animalList; + + public IEnumerable AnimalList + { + get { return animalList; } + } + + public Animals() + { + animalList = new List(); + animalList.Add(new Animal("California Newt", Category.Amphibians)); + animalList.Add(new Animal("Giant Panda", Category.Bears)); + animalList.Add(new Animal("Coyote", Category.Canines)); + animalList.Add(new Animal("Golden Silk Spider", Category.Spiders)); + animalList.Add(new Animal("Mandrill", Category.Primates)); + animalList.Add(new Animal("Black Bear", Category.Bears)); + animalList.Add(new Animal("Jaguar", Category.BigCats)); + animalList.Add(new Animal("Bornean Gibbon", Category.Primates)); + animalList.Add(new Animal("African Wildcat", Category.BigCats)); + animalList.Add(new Animal("Arctic Fox", Category.Canines)); + animalList.Add(new Animal("Tomato Frog", Category.Amphibians)); + animalList.Add(new Animal("Grizzly Bear", Category.Bears)); + animalList.Add(new Animal("Dingo", Category.Canines)); + animalList.Add(new Animal("Gorilla", Category.Primates)); + animalList.Add(new Animal("Green Tree Frog", Category.Amphibians)); + animalList.Add(new Animal("Bald Uakari", Category.Primates)); + animalList.Add(new Animal("Polar Bear", Category.Bears)); + animalList.Add(new Animal("Black Widow Spider", Category.Spiders)); + animalList.Add(new Animal("Bat-Eared Fox", Category.Canines)); + animalList.Add(new Animal("Cheetah", Category.BigCats)); + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.5.0.resharper.user b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.5.0.resharper.user new file mode 100644 index 0000000..4d7c088 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.5.0.resharper.user @@ -0,0 +1,11 @@ + + + + +TeamCity; + + + + False + + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.csproj b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.csproj new file mode 100644 index 0000000..6303243 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.csproj @@ -0,0 +1,92 @@ + + + Debug + AnyCPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557} + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GroupingTreeView + GroupingTreeView + 4 + winexe + 1.0.0.* + + false + v3.0 + + + 2.0 + + + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + MyApp.xaml + Code + + + Window1.xaml + Code + + + + + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.sln b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.sln new file mode 100644 index 0000000..edc9a2d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GroupingTreeView", "GroupingTreeView.csproj", "{85B6A0DA-47D9-4347-97C4-89F70D3B2557}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.suo b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/GroupingTreeView.suo new file mode 100644 index 0000000000000000000000000000000000000000..7952f373b1249d58aca93b0a2f43dcb24f27c4e0 GIT binary patch literal 23040 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 L@X(b~BO~xXLYO!! literal 0 HcmV?d00001 diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml new file mode 100644 index 0000000..35566c3 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml.cs new file mode 100644 index 0000000..db1f60d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/MyApp.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Windows; +using System.Data; +using System.Xml; +using System.Configuration; + +namespace GroupingTreeView +{ + /// + /// Interaction logic for MyApp.xaml + /// + + public partial class MyApp : Application + { + + } +} \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/AssemblyInfo.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1e66b97 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/AssemblyInfo.cs @@ -0,0 +1,54 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Resources; +using System.Globalization; +using System.Windows; +using System.Runtime.InteropServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GroupingTreeView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GroupingTreeView")] +[assembly: AssemblyCopyright("Copyright @ 2006")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.Designer.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0ee2cd4 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.1318 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GroupingTreeView.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GroupingTreeView.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.resx b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.Designer.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.Designer.cs new file mode 100644 index 0000000..742c53d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.1318 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GroupingTreeView.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.settings b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml new file mode 100644 index 0000000..7cb13e4 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml.cs b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml.cs new file mode 100644 index 0000000..9036c7d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView - Orcas Beta 2/Window1.xaml.cs @@ -0,0 +1,25 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.Collections.Generic; + + +namespace GroupingTreeView +{ + /// + /// Interaction logic for Window1.xaml + /// + + public partial class Window1 : Window + { + public Window1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView/DataSource.cs b/15-GroupingTreeView/15GroupingTreeView/DataSource.cs new file mode 100644 index 0000000..568663e --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/DataSource.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace GroupingTreeView +{ + public class Animal + { + private string name; + + public string Name + { + get { return name; } + set { name = value; } + } + + private Category category; + + public Category Category + { + get { return category; } + set { category = value; } + } + + public Animal(string name, Category category) + { + this.name = name; + this.category = category; + } + } + + public enum Category + { + Amphibians, + Bears, + BigCats, + Canines, + Primates, + Spiders, + } + + public class Animals + { + private List animalList; + + public IEnumerable AnimalList + { + get { return animalList; } + } + + public Animals() + { + animalList = new List(); + animalList.Add(new Animal("California Newt", Category.Amphibians)); + animalList.Add(new Animal("Giant Panda", Category.Bears)); + animalList.Add(new Animal("Coyote", Category.Canines)); + animalList.Add(new Animal("Golden Silk Spider", Category.Spiders)); + animalList.Add(new Animal("Mandrill", Category.Primates)); + animalList.Add(new Animal("Black Bear", Category.Bears)); + animalList.Add(new Animal("Jaguar", Category.BigCats)); + animalList.Add(new Animal("Bornean Gibbon", Category.Primates)); + animalList.Add(new Animal("African Wildcat", Category.BigCats)); + animalList.Add(new Animal("Arctic Fox", Category.Canines)); + animalList.Add(new Animal("Tomato Frog", Category.Amphibians)); + animalList.Add(new Animal("Grizzly Bear", Category.Bears)); + animalList.Add(new Animal("Dingo", Category.Canines)); + animalList.Add(new Animal("Gorilla", Category.Primates)); + animalList.Add(new Animal("Green Tree Frog", Category.Amphibians)); + animalList.Add(new Animal("Bald Uakari", Category.Primates)); + animalList.Add(new Animal("Polar Bear", Category.Bears)); + animalList.Add(new Animal("Black Widow Spider", Category.Spiders)); + animalList.Add(new Animal("Bat-Eared Fox", Category.Canines)); + animalList.Add(new Animal("Cheetah", Category.BigCats)); + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.csproj b/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.csproj new file mode 100644 index 0000000..0266477 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.csproj @@ -0,0 +1,79 @@ + + + Debug + AnyCPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557} + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + GroupingTreeView + GroupingTreeView + 4 + winexe + 1.0.0.* + + false + + + true + full + false + .\bin\Debug\ + DEBUG;TRACE + + + false + true + .\bin\Release\ + TRACE + + + + + + + + + + + + + + + + + + + + + MyApp.xaml + Code + + + Window1.xaml + Code + + + + + + + ResXFileCodeGenerator + Resources.cs + Designer + + + True + Resources.resx + + + SettingsSingleFileGenerator + Settings.cs + + + True + Settings.settings + + + + + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.sln b/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.sln new file mode 100644 index 0000000..1fc06d4 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GroupingTreeView", "GroupingTreeView.csproj", "{85B6A0DA-47D9-4347-97C4-89F70D3B2557}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Debug|Any CPU.Build.0 = Debug|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Release|Any CPU.ActiveCfg = Release|Any CPU + {85B6A0DA-47D9-4347-97C4-89F70D3B2557}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.suo b/15-GroupingTreeView/15GroupingTreeView/GroupingTreeView.suo new file mode 100644 index 0000000000000000000000000000000000000000..f3c912ea0583b8a0417e8f791096f8a1facb28cf GIT binary patch literal 16896 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 GcK<(@kWe=O literal 0 HcmV?d00001 diff --git a/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml b/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml new file mode 100644 index 0000000..4eee779 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml @@ -0,0 +1,9 @@ + + + + + diff --git a/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml.cs b/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml.cs new file mode 100644 index 0000000..db1f60d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/MyApp.xaml.cs @@ -0,0 +1,17 @@ +using System; +using System.Windows; +using System.Data; +using System.Xml; +using System.Configuration; + +namespace GroupingTreeView +{ + /// + /// Interaction logic for MyApp.xaml + /// + + public partial class MyApp : Application + { + + } +} \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView/Properties/AssemblyInfo.cs b/15-GroupingTreeView/15GroupingTreeView/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1e66b97 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Properties/AssemblyInfo.cs @@ -0,0 +1,54 @@ +#region Using directives + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Resources; +using System.Globalization; +using System.Windows; +using System.Runtime.InteropServices; + +#endregion + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GroupingTreeView")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GroupingTreeView")] +[assembly: AssemblyCopyright("Copyright @ 2006")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.*")] diff --git a/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.cs b/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.cs new file mode 100644 index 0000000..a39541f --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.cs @@ -0,0 +1,70 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GroupingTreeView.Properties +{ + using System; + using System.IO; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the Strongly Typed Resource Builder + // class via a tool like ResGen or Visual Studio.NET. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + class Resources + { + + private static System.Resources.ResourceManager _resMgr; + + private static System.Globalization.CultureInfo _resCulture; + + /*FamANDAssem*/ + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Resources.ResourceManager ResourceManager + { + get + { + if ((_resMgr == null)) + { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("Resources", typeof(Resources).Assembly); + _resMgr = temp; + } + return _resMgr; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + public static System.Globalization.CultureInfo Culture + { + get + { + return _resCulture; + } + set + { + _resCulture = value; + } + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.resx b/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.resx new file mode 100644 index 0000000..3e18af9 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.cs b/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.cs new file mode 100644 index 0000000..5a5e7cd --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.cs @@ -0,0 +1,42 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.42 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace GroupingTreeView.Properties +{ + public partial class Settings : System.Configuration.ApplicationSettingsBase + { + private static Settings m_Value; + + private static object m_SyncObject = new object(); + + public static Settings Value + { + get + { + if ((Settings.m_Value == null)) + { + System.Threading.Monitor.Enter(Settings.m_SyncObject); + if ((Settings.m_Value == null)) + { + try + { + Settings.m_Value = new Settings(); + } + finally + { + System.Threading.Monitor.Exit(Settings.m_SyncObject); + } + } + } + return Settings.m_Value; + } + } + } +} diff --git a/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.settings b/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.settings new file mode 100644 index 0000000..4024694 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/15-GroupingTreeView/15GroupingTreeView/Window1.xaml b/15-GroupingTreeView/15GroupingTreeView/Window1.xaml new file mode 100644 index 0000000..1b6ad69 --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Window1.xaml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/15-GroupingTreeView/15GroupingTreeView/Window1.xaml.cs b/15-GroupingTreeView/15GroupingTreeView/Window1.xaml.cs new file mode 100644 index 0000000..9036c7d --- /dev/null +++ b/15-GroupingTreeView/15GroupingTreeView/Window1.xaml.cs @@ -0,0 +1,25 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.Collections.Generic; + + +namespace GroupingTreeView +{ + /// + /// Interaction logic for Window1.xaml + /// + + public partial class Window1 : Window + { + public Window1() + { + InitializeComponent(); + } + } +} \ No newline at end of file diff --git a/15-GroupingTreeView/Images/15GroupingTreeView.png b/15-GroupingTreeView/Images/15GroupingTreeView.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6ff4738607695a239d36c9e490f24e4acf5e33 GIT binary patch literal 13100 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's blog post on this topic). But what do you do if the data you're given is not structured hierarchically? In this post, I will show you how to create that hierarchy from a flat list of data items, using the grouping feature of data binding. + +I am using the same Animal data source I used in my last post. Grouping the Animals by Category is done the same way as in my last sample: + + + + + + + + + +We now have the data in a hierarchical form. In this particular case it has only one level of groups, and another level with the animals. You can easily imagine that by adding more GroupDescriptions you would end up with a deeper hierarchy. + +When binding to a CollectionViewSource, the Binding object knows to grab the CollectionViewSource's View property. This property returns the custom view (of type ICollectionView) that CollectionViewSource creates on top of the data collection (where the grouping is applied). In our scenario, we want to bind to the hierarchy we created with grouping, or in other words, we want to bind to the groups. We can get to this data by binding to the Groups property in ICollectionView: + + + + +When using data binding's grouping feature, each group of items is wrapped in a CollectionViewGroup object. We can access the name of the group (the property we're grouping by) by using CollectionViewGroup's Name property, and we can get to the items that belong to the group through the Items property. This is all the information we need in order to make a HierarchicalDataTemplate that will display the Category of each animal and specify the animals that belong to it: + + + + + +Finally we need a DataTemplate for the leaf nodes, which specifies how we want the Animal data to be displayed. In this case, we are interested in displaying the Name property of each Animal. Notice that the HierarchicalDataTemplate's ItemTemplate property points to this template. + + + + + +Here is the result of the completed sample: + +![](Images/15GroupingTreeView.png)