Browse Source

Slyecoping.

pull/83/head
Steven Kirk 11 years ago
parent
commit
5dc0e604fb
  1. 9
      Tests/Perspex.Base.UnitTests/GlobalSuppressions.cs
  2. 9
      Tests/Perspex.Controls.UnitTests/GlobalSuppressions.cs
  3. 9
      Tests/Perspex.Direct2D1.UnitTests/GlobalSuppressions.cs
  4. 9
      Tests/Perspex.Input.UnitTests/GlobalSuppressions.cs
  5. 9
      Tests/Perspex.Interactivity.UnitTests/GlobalSuppressions.cs
  6. 9
      Tests/Perspex.Layout.UnitTests/GlobalSuppressions.cs
  7. 9
      Tests/Perspex.RenderTests/GlobalSuppressions.cs
  8. 9
      Tests/Perspex.SceneGraph.UnitTests/GlobalSuppressions.cs
  9. 9
      Tests/Perspex.Styling.UnitTests/GlobalSuppressions.cs
  10. 21
      src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs
  11. 25
      src/Markup/Perspex.Markup.Xaml/Context/PerspexParserFactory.cs
  12. 8
      src/Markup/Perspex.Markup.Xaml/Context/PerspexTypeRepository.cs
  13. 13
      src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs
  14. 8
      src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMember.cs
  15. 34
      src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs
  16. 10
      src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlType.cs
  17. 6
      src/Markup/Perspex.Markup.Xaml/Converters/BitmapConverter.cs
  18. 6
      src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs
  19. 8
      src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs
  20. 8
      src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs
  21. 32
      src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs
  22. 17
      src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/PropertyMountPoint.cs
  23. 14
      src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/PropertyPath.cs
  24. 22
      src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/TargettedProperty.cs
  25. 44
      src/Markup/Perspex.Markup.Xaml/DataBinding/DataContextChangeSynchronizer.cs
  26. 10
      src/Markup/Perspex.Markup.Xaml/DataBinding/IPerspexPropertyBinder.cs
  27. 18
      src/Markup/Perspex.Markup.Xaml/DataBinding/PerspexPropertyBinder.cs
  28. 11
      src/Markup/Perspex.Markup.Xaml/DataBinding/SourceBindingEndpoint.cs
  29. 11
      src/Markup/Perspex.Markup.Xaml/DataBinding/TargetBindingEndpoint.cs
  30. 37
      src/Markup/Perspex.Markup.Xaml/DataBinding/XamlBinding.cs
  31. 16
      src/Markup/Perspex.Markup.Xaml/DataBinding/XamlBindingDefinition.cs
  32. 18
      src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
  33. 18
      src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs
  34. 6
      src/Markup/Perspex.Markup.Xaml/Templates/Template.cs
  35. 10
      src/Markup/Perspex.Markup.Xaml/Templates/TemplateContent.cs
  36. 6
      src/Markup/Perspex.Markup.Xaml/Templates/TemplateLoader.cs
  37. 19
      src/Markup/Perspex.Markup.Xaml/Templates/XamlDataTemplate.cs
  38. 1
      src/Perspex.Animation/Perspex.Animation.csproj
  39. 1
      src/Perspex.Application/Perspex.Application.csproj
  40. 1
      src/Perspex.Base/Perspex.Base.csproj
  41. 2
      src/Perspex.Base/Threading/Dispatcher.cs
  42. 2
      src/Perspex.Base/Threading/DispatcherTimer.cs
  43. 13
      src/Perspex.Controls/IContentControl.cs
  44. 7
      src/Perspex.Controls/IGlobalDataTemplates.cs
  45. 6
      src/Perspex.Controls/IHeadered.cs
  46. 3
      src/Perspex.Controls/Perspex.Controls.csproj
  47. 1
      src/Perspex.Diagnostics/Perspex.Diagnostics.csproj
  48. 1
      src/Perspex.Input/Perspex.Input.csproj
  49. 1
      src/Perspex.Interactivity/Perspex.Interactivity.csproj
  50. 1
      src/Perspex.Layout/Perspex.Layout.csproj
  51. 1
      src/Perspex.SceneGraph/Perspex.SceneGraph.csproj
  52. 1
      src/Perspex.Styling/Perspex.Styling.csproj
  53. 1
      src/Perspex.Themes.Default/Perspex.Themes.Default.csproj
  54. 1
      src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj
  55. 1
      src/Windows/Perspex.Win32/Perspex.Win32.csproj

9
Tests/Perspex.Base.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules", "StyleCop.CSharp.MaintainabilityRules",

9
Tests/Perspex.Controls.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules", "StyleCop.CSharp.MaintainabilityRules",

9
Tests/Perspex.Direct2D1.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules", "StyleCop.CSharp.MaintainabilityRules",

9
Tests/Perspex.Input.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules", "StyleCop.CSharp.MaintainabilityRules",

9
Tests/Perspex.Interactivity.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.DocumentationRules", "StyleCop.CSharp.DocumentationRules",

9
Tests/Perspex.Layout.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.DocumentationRules", "StyleCop.CSharp.DocumentationRules",

9
Tests/Perspex.RenderTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.MaintainabilityRules", "StyleCop.CSharp.MaintainabilityRules",

9
Tests/Perspex.SceneGraph.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.DocumentationRules", "StyleCop.CSharp.DocumentationRules",

9
Tests/Perspex.Styling.UnitTests/GlobalSuppressions.cs

@ -1,7 +1,8 @@
// This file is used by Code Analysis to maintain SuppressMessage // -----------------------------------------------------------------------
// attributes that are applied to this project. // <copyright file="GlobalSuppressions.cs" company="Steven Kirk">
// Project-level suppressions either have no target or are given // Copyright 2015 MIT Licence. See licence.md for more information.
// a specific target and scoped to a namespace, type, member, etc. // </copyright>
// -----------------------------------------------------------------------
[assembly: System.Diagnostics.CodeAnalysis.SuppressMessage( [assembly: System.Diagnostics.CodeAnalysis.SuppressMessage(
"StyleCop.CSharp.DocumentationRules", "StyleCop.CSharp.DocumentationRules",

21
src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.Context // -----------------------------------------------------------------------
// <copyright file="PerspexObjectAssembler.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context
{ {
using System; using System;
using OmniXaml; using OmniXaml;
@ -15,21 +21,24 @@
mapping.Map<XamlDataTemplate>(template => template.Content, new TemplateLoader()); mapping.Map<XamlDataTemplate>(template => template.Content, new TemplateLoader());
var assembler = new ObjectAssembler(wiringContext, new TopDownMemberValueContext(), objectAssemblerSettings); var assembler = new ObjectAssembler(wiringContext, new TopDownMemberValueContext(), objectAssemblerSettings);
objectAssembler = new TemplateHostingObjectAssembler(assembler, mapping); this.objectAssembler = new TemplateHostingObjectAssembler(assembler, mapping);
} }
public object Result => objectAssembler.Result; public object Result => this.objectAssembler.Result;
public EventHandler<XamlSetValueEventArgs> XamlSetValueHandler { get; set; } public EventHandler<XamlSetValueEventArgs> XamlSetValueHandler { get; set; }
public IWiringContext WiringContext => objectAssembler.WiringContext;
public IWiringContext WiringContext => this.objectAssembler.WiringContext;
public void Process(XamlInstruction node) public void Process(XamlInstruction node)
{ {
objectAssembler.Process(node); this.objectAssembler.Process(node);
} }
public void OverrideInstance(object instance) public void OverrideInstance(object instance)
{ {
objectAssembler.OverrideInstance(instance); this.objectAssembler.OverrideInstance(instance);
} }
} }
} }

25
src/Markup/Perspex.Markup.Xaml/Context/PerspexParserFactory.cs

@ -1,10 +1,15 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexParserFactory.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using OmniXaml; using OmniXaml;
using OmniXaml.ObjectAssembler; using OmniXaml.ObjectAssembler;
using OmniXaml.Parsers.ProtoParser; using OmniXaml.Parsers.ProtoParser;
using OmniXaml.Parsers.XamlNodes; using OmniXaml.Parsers.XamlNodes;
using Perspex.Markup.Xaml.Context;
public class PerspexParserFactory : IXamlParserFactory public class PerspexParserFactory : IXamlParserFactory
{ {
@ -17,22 +22,22 @@ namespace Perspex.Markup.Xaml.Context
public PerspexParserFactory(ITypeFactory typeFactory) public PerspexParserFactory(ITypeFactory typeFactory)
{ {
wiringContext = new PerspexWiringContext(typeFactory); this.wiringContext = new PerspexWiringContext(typeFactory);
} }
public IXamlParser CreateForReadingFree() public IXamlParser CreateForReadingFree()
{ {
var objectAssemblerForUndefinedRoot = GetObjectAssemblerForUndefinedRoot(); var objectAssemblerForUndefinedRoot = this.GetObjectAssemblerForUndefinedRoot();
return CreateParser(objectAssemblerForUndefinedRoot); return this.CreateParser(objectAssemblerForUndefinedRoot);
} }
private IXamlParser CreateParser(IObjectAssembler objectAssemblerForUndefinedRoot) private IXamlParser CreateParser(IObjectAssembler objectAssemblerForUndefinedRoot)
{ {
var xamlInstructionParser = new OrderAwareXamlInstructionParser(new XamlInstructionParser(wiringContext)); var xamlInstructionParser = new OrderAwareXamlInstructionParser(new XamlInstructionParser(this.wiringContext));
var phaseParserKit = new PhaseParserKit( var phaseParserKit = new PhaseParserKit(
new XamlProtoInstructionParser(wiringContext), new XamlProtoInstructionParser(this.wiringContext),
xamlInstructionParser, xamlInstructionParser,
objectAssemblerForUndefinedRoot); objectAssemblerForUndefinedRoot);
@ -41,19 +46,19 @@ namespace Perspex.Markup.Xaml.Context
private IObjectAssembler GetObjectAssemblerForUndefinedRoot() private IObjectAssembler GetObjectAssemblerForUndefinedRoot()
{ {
return new ObjectAssembler(wiringContext, new TopDownMemberValueContext()); return new ObjectAssembler(this.wiringContext, new TopDownMemberValueContext());
} }
public IXamlParser CreateForReadingSpecificInstance(object rootInstance) public IXamlParser CreateForReadingSpecificInstance(object rootInstance)
{ {
var objectAssemblerForUndefinedRoot = GetObjectAssemblerForSpecificRoot(rootInstance); var objectAssemblerForUndefinedRoot = this.GetObjectAssemblerForSpecificRoot(rootInstance);
return CreateParser(objectAssemblerForUndefinedRoot); return this.CreateParser(objectAssemblerForUndefinedRoot);
} }
private IObjectAssembler GetObjectAssemblerForSpecificRoot(object rootInstance) private IObjectAssembler GetObjectAssemblerForSpecificRoot(object rootInstance)
{ {
return new PerspexObjectAssembler(wiringContext, new ObjectAssemblerSettings { RootInstance = rootInstance }); return new PerspexObjectAssembler(this.wiringContext, new ObjectAssemblerSettings { RootInstance = rootInstance });
} }
} }
} }

8
src/Markup/Perspex.Markup.Xaml/Context/PerspexTypeRepository.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexTypeRepository.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using System; using System;
@ -23,7 +29,7 @@ namespace Perspex.Markup.Xaml.Context
public override XamlType GetXamlType(Type type) public override XamlType GetXamlType(Type type)
{ {
Guard.ThrowIfNull(type, nameof(type)); Guard.ThrowIfNull(type, nameof(type));
return new PerspexXamlType(type, this, typeFactory, FeatureProvider, propertyBinder); return new PerspexXamlType(type, this, this.typeFactory, this.FeatureProvider, this.propertyBinder);
} }
} }
} }

13
src/Markup/Perspex.Markup.Xaml/Context/PerspexWiringContext.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexWiringContext.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using System.Collections.Generic; using System.Collections.Generic;
@ -29,7 +35,7 @@ namespace Perspex.Markup.Xaml.Context
var perspexPropertyBinder = new PerspexPropertyBinder(featureProvider.ConverterProvider); var perspexPropertyBinder = new PerspexPropertyBinder(featureProvider.ConverterProvider);
var xamlTypeRepository = new PerspexTypeRepository(xamlNamespaceRegistry, typeFactory, featureProvider, perspexPropertyBinder); var xamlTypeRepository = new PerspexTypeRepository(xamlNamespaceRegistry, typeFactory, featureProvider, perspexPropertyBinder);
var typeContext = new TypeContext(xamlTypeRepository, xamlNamespaceRegistry, typeFactory); var typeContext = new TypeContext(xamlTypeRepository, xamlNamespaceRegistry, typeFactory);
context = new WiringContext(typeContext, featureProvider); this.context = new WiringContext(typeContext, featureProvider);
} }
private static XamlNamespaceRegistry CreateXamlNamespaceRegistry() private static XamlNamespaceRegistry CreateXamlNamespaceRegistry()
@ -106,7 +112,8 @@ namespace Perspex.Markup.Xaml.Context
return contentPropertyProvider; return contentPropertyProvider;
} }
public ITypeContext TypeContext => context.TypeContext; public ITypeContext TypeContext => this.context.TypeContext;
public ITypeFeatureProvider FeatureProvider => context.FeatureProvider;
public ITypeFeatureProvider FeatureProvider => this.context.FeatureProvider;
} }
} }

8
src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMember.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexXamlMember.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using DataBinding; using DataBinding;
@ -20,7 +26,7 @@ namespace Perspex.Markup.Xaml.Context
protected override IXamlMemberValuePlugin LookupXamlMemberValueConnector() protected override IXamlMemberValuePlugin LookupXamlMemberValueConnector()
{ {
return new PerspexXamlMemberValuePlugin(this, propertyBinder); return new PerspexXamlMemberValuePlugin(this, this.propertyBinder);
} }
public override string ToString() public override string ToString()

34
src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexXamlMemberValuePlugin.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using System; using System;
@ -20,9 +26,9 @@ namespace Perspex.Markup.Xaml.Context
public override void SetValue(object instance, object value) public override void SetValue(object instance, object value)
{ {
if (ValueRequiresSpecialHandling(value)) if (this.ValueRequiresSpecialHandling(value))
{ {
HandleSpecialValue(instance, value); this.HandleSpecialValue(instance, value);
} }
else else
{ {
@ -35,11 +41,11 @@ namespace Perspex.Markup.Xaml.Context
var definition = value as XamlBindingDefinition; var definition = value as XamlBindingDefinition;
if (definition != null) if (definition != null)
{ {
HandleXamlBindingDefinition(definition); this.HandleXamlBindingDefinition(definition);
} }
else if (IsPerspexProperty) else if (this.IsPerspexProperty)
{ {
HandlePerspexProperty(instance, value); this.HandlePerspexProperty(instance, value);
} }
else else
{ {
@ -49,7 +55,7 @@ namespace Perspex.Markup.Xaml.Context
private void HandlePerspexProperty(object instance, object value) private void HandlePerspexProperty(object instance, object value)
{ {
var pp = PerspexProperty; var pp = this.PerspexProperty;
var po = (PerspexObject) instance; var po = (PerspexObject) instance;
po.SetValue(pp, value); po.SetValue(pp, value);
} }
@ -57,10 +63,10 @@ namespace Perspex.Markup.Xaml.Context
private void HandleXamlBindingDefinition(XamlBindingDefinition xamlBindingDefinition) private void HandleXamlBindingDefinition(XamlBindingDefinition xamlBindingDefinition)
{ {
PerspexObject subjectObject = xamlBindingDefinition.Target; PerspexObject subjectObject = xamlBindingDefinition.Target;
propertyBinder.Create(xamlBindingDefinition); this.propertyBinder.Create(xamlBindingDefinition);
var observableForDataContext = subjectObject.GetObservable(Control.DataContextProperty); var observableForDataContext = subjectObject.GetObservable(Control.DataContextProperty);
observableForDataContext.Where(o => o != null).Subscribe(_ => BindToDataContextWhenItsSet(xamlBindingDefinition)); observableForDataContext.Where(o => o != null).Subscribe(_ => this.BindToDataContextWhenItsSet(xamlBindingDefinition));
} }
private void BindToDataContextWhenItsSet(XamlBindingDefinition definition) private void BindToDataContextWhenItsSet(XamlBindingDefinition definition)
@ -68,7 +74,7 @@ namespace Perspex.Markup.Xaml.Context
var target = definition.Target; var target = definition.Target;
var dataContext = target.DataContext; var dataContext = target.DataContext;
var binding = propertyBinder.GetBinding(target, definition.TargetProperty); var binding = this.propertyBinder.GetBinding(target, definition.TargetProperty);
binding.Bind(dataContext); binding.Bind(dataContext);
} }
@ -77,8 +83,8 @@ namespace Perspex.Markup.Xaml.Context
{ {
get get
{ {
var underlyingType = xamlMember.DeclaringType.UnderlyingType; var underlyingType = this.xamlMember.DeclaringType.UnderlyingType;
var name = xamlMember.Name + "Property"; var name = this.xamlMember.Name + "Property";
var value = ReflectionExtensions.GetValueOfStaticField(underlyingType, name); var value = ReflectionExtensions.GetValueOfStaticField(underlyingType, name);
return value as PerspexProperty; return value as PerspexProperty;
@ -87,14 +93,14 @@ namespace Perspex.Markup.Xaml.Context
private bool ValueRequiresSpecialHandling(object value) private bool ValueRequiresSpecialHandling(object value)
{ {
return value is XamlBindingDefinition || IsPerspexProperty; return value is XamlBindingDefinition || this.IsPerspexProperty;
} }
private bool IsPerspexProperty => PerspexProperty != null; private bool IsPerspexProperty => this.PerspexProperty != null;
public override string ToString() public override string ToString()
{ {
return $"{{Perspex Value Connector for member {xamlMember}}}"; return $"{{Perspex Value Connector for member {this.xamlMember}}}";
} }
} }
} }

10
src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlType.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexXamlType.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Context namespace Perspex.Markup.Xaml.Context
{ {
using System; using System;
@ -18,11 +24,11 @@ namespace Perspex.Markup.Xaml.Context
this.propertyBinder = propertyBinder; this.propertyBinder = propertyBinder;
} }
protected IPerspexPropertyBinder PropertyBinder => propertyBinder; protected IPerspexPropertyBinder PropertyBinder => this.propertyBinder;
protected override XamlMember LookupMember(string name) protected override XamlMember LookupMember(string name)
{ {
return new PerspexXamlMember(name, this, TypeRepository, FeatureProvider, propertyBinder); return new PerspexXamlMember(name, this, this.TypeRepository, this.FeatureProvider, this.propertyBinder);
} }
public override string ToString() public override string ToString()

6
src/Markup/Perspex.Markup.Xaml/Converters/BitmapConverter.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="BitmapConverter.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Converters namespace Perspex.Markup.Xaml.Converters
{ {
using System; using System;

6
src/Markup/Perspex.Markup.Xaml/Converters/BrushConverter.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="BrushConverter.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Converters namespace Perspex.Markup.Xaml.Converters
{ {
using System; using System;

8
src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.Converters // -----------------------------------------------------------------------
// <copyright file="GridLengthTypeConverter.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Converters
{ {
using System; using System;
using System.Globalization; using System.Globalization;

8
src/Markup/Perspex.Markup.Xaml/Converters/ThicknessConverter.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.Converters // -----------------------------------------------------------------------
// <copyright file="ThicknessConverter.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Converters
{ {
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;

32
src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/ObservablePropertyBranch.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="ObservablePropertyBranch.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
{ {
using System; using System;
@ -21,9 +27,9 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
this.root = root; this.root = root;
this.propertyPath = propertyPath; this.propertyPath = propertyPath;
mountPoint = new PropertyMountPoint(root, propertyPath); this.mountPoint = new PropertyMountPoint(root, propertyPath);
var subscriptions = GetInpcNodes(); var subscriptions = this.GetInpcNodes();
Changed = CreateObservableFromNodes(subscriptions); this.Changed = this.CreateObservableFromNodes(subscriptions);
} }
private IObservable<object> CreateObservableFromNodes(IEnumerable<InpcNode> subscriptions) private IObservable<object> CreateObservableFromNodes(IEnumerable<InpcNode> subscriptions)
@ -32,14 +38,14 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
subscription => Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>( subscription => Observable.FromEventPattern<PropertyChangedEventHandler, PropertyChangedEventArgs>(
ev => subscription.Parent.PropertyChanged += ev, ev => subscription.Parent.PropertyChanged += ev,
handler => subscription.Parent.PropertyChanged -= handler) handler => subscription.Parent.PropertyChanged -= handler)
.Do(_ => mountPoint = new PropertyMountPoint(root, propertyPath)) .Do(_ => this.mountPoint = new PropertyMountPoint(this.root, this.propertyPath))
.Where(pattern => pattern.EventArgs.PropertyName == subscription.PropertyName)) .Where(pattern => pattern.EventArgs.PropertyName == subscription.PropertyName))
.Merge(); .Merge();
} }
private IEnumerable<InpcNode> GetInpcNodes() private IEnumerable<InpcNode> GetInpcNodes()
{ {
return GetSubscriptionsRecursive(root, propertyPath, 0); return this.GetSubscriptionsRecursive(this.root, this.propertyPath, 0);
} }
private IEnumerable<InpcNode> GetSubscriptionsRecursive(object current, PropertyPath propertyPath, int i) private IEnumerable<InpcNode> GetSubscriptionsRecursive(object current, PropertyPath propertyPath, int i)
@ -60,7 +66,7 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
var currentObjectTypeInfo = current.GetType().GetTypeInfo(); var currentObjectTypeInfo = current.GetType().GetTypeInfo();
var nextProperty = currentObjectTypeInfo.GetDeclaredProperty(nextPropertyName); var nextProperty = currentObjectTypeInfo.GetDeclaredProperty(nextPropertyName);
var nextInstance = nextProperty.GetValue(current); var nextInstance = nextProperty.GetValue(current);
subscriptions.AddRange(GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1)); subscriptions.AddRange(this.GetSubscriptionsRecursive(nextInstance, propertyPath, i + 1));
} }
return subscriptions; return subscriptions;
@ -72,25 +78,27 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
{ {
get get
{ {
return mountPoint.Value; return this.mountPoint.Value;
} }
set set
{ {
mountPoint.Value = value; this.mountPoint.Value = value;
} }
} }
public Type Type => mountPoint.ProperyType; public Type Type => this.mountPoint.ProperyType;
private class InpcNode private class InpcNode
{ {
public InpcNode(INotifyPropertyChanged parent, string propertyName) public InpcNode(INotifyPropertyChanged parent, string propertyName)
{ {
Parent = parent; this.Parent = parent;
PropertyName = propertyName; this.PropertyName = propertyName;
} }
public INotifyPropertyChanged Parent { get; } public INotifyPropertyChanged Parent { get; }
public string PropertyName { get; } public string PropertyName { get; }
} }
} }

17
src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/PropertyMountPoint.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking // -----------------------------------------------------------------------
// <copyright file="PropertyMountPoint.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
{ {
using System; using System;
using System.Reflection; using System.Reflection;
@ -9,7 +15,7 @@
private readonly TargettedProperty referencedTargettedProperty; private readonly TargettedProperty referencedTargettedProperty;
public PropertyMountPoint(object origin, PropertyPath propertyPath) public PropertyMountPoint(object origin, PropertyPath propertyPath)
{ {
Guard.ThrowIfNull(origin, nameof(origin)); Guard.ThrowIfNull(origin, nameof(origin));
Guard.ThrowIfNull(propertyPath, nameof(propertyPath)); Guard.ThrowIfNull(propertyPath, nameof(propertyPath));
@ -35,14 +41,15 @@
{ {
get get
{ {
return referencedTargettedProperty.Value; return this.referencedTargettedProperty.Value;
} }
set set
{ {
referencedTargettedProperty.Value = value; this.referencedTargettedProperty.Value = value;
} }
} }
public Type ProperyType => referencedTargettedProperty.PropertyType; public Type ProperyType => this.referencedTargettedProperty.PropertyType;
} }
} }

14
src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/PropertyPath.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="PropertyPath.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
{ {
public class PropertyPath public class PropertyPath
@ -10,14 +16,14 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
} }
public PropertyPath(string path) public PropertyPath(string path)
{ {
chunks = path.Split('.'); this.chunks = path.Split('.');
} }
public string[] Chunks public string[] Chunks
{ {
get { return chunks; } get { return this.chunks; }
set { chunks = value; } set { this.chunks = value; }
} }
public PropertyPath Clone() public PropertyPath Clone()

22
src/Markup/Perspex.Markup.Xaml/DataBinding/ChangeTracking/TargettedProperty.cs

@ -1,11 +1,16 @@
// -----------------------------------------------------------------------
// <copyright file="TargettedProperty.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
{ {
using System; using System;
using System.Reflection; using System.Reflection;
using Controls;
using Glass; using Glass;
class TargettedProperty internal class TargettedProperty
{ {
private readonly object instance; private readonly object instance;
private readonly PropertyInfo propertyInfo; private readonly PropertyInfo propertyInfo;
@ -21,14 +26,19 @@ namespace Perspex.Markup.Xaml.DataBinding.ChangeTracking
public object Value public object Value
{ {
get { return propertyInfo.GetValue(instance); } get
{
return this.propertyInfo.GetValue(this.instance);
}
set set
{ {
propertyInfo.SetValue(instance, value); this.propertyInfo.SetValue(this.instance, value);
} }
} }
public Type PropertyType => propertyInfo.PropertyType; public Type PropertyType => this.propertyInfo.PropertyType;
public string Name => propertyInfo.Name;
public string Name => this.propertyInfo.Name;
} }
} }

44
src/Markup/Perspex.Markup.Xaml/DataBinding/DataContextChangeSynchronizer.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="DataContextChangeSynchronizer.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding namespace Perspex.Markup.Xaml.DataBinding
{ {
using System; using System;
@ -23,17 +29,17 @@ namespace Perspex.Markup.Xaml.DataBinding
Guard.ThrowIfNull(source, nameof(source)); Guard.ThrowIfNull(source, nameof(source));
Guard.ThrowIfNull(typeConverterProvider, nameof(typeConverterProvider)); Guard.ThrowIfNull(typeConverterProvider, nameof(typeConverterProvider));
bindingEndpoint = new TargetBindingEndpoint(target, targetProperty); this.bindingEndpoint = new TargetBindingEndpoint(target, targetProperty);
sourceEndpoint = new ObservablePropertyBranch(source, sourcePropertyPath); this.sourceEndpoint = new ObservablePropertyBranch(source, sourcePropertyPath);
targetPropertyTypeConverter = typeConverterProvider.GetTypeConverter(targetProperty.PropertyType); this.targetPropertyTypeConverter = typeConverterProvider.GetTypeConverter(targetProperty.PropertyType);
} }
private bool CanAssignWithoutConversion private bool CanAssignWithoutConversion
{ {
get get
{ {
var sourceTypeInfo = sourceEndpoint.Type.GetTypeInfo(); var sourceTypeInfo = this.sourceEndpoint.Type.GetTypeInfo();
var targetTypeInfo = bindingEndpoint.Property.PropertyType.GetTypeInfo(); var targetTypeInfo = this.bindingEndpoint.Property.PropertyType.GetTypeInfo();
var compatible = targetTypeInfo.IsAssignableFrom(sourceTypeInfo); var compatible = targetTypeInfo.IsAssignableFrom(sourceTypeInfo);
return compatible; return compatible;
} }
@ -41,19 +47,19 @@ namespace Perspex.Markup.Xaml.DataBinding
public void SubscribeModelToUI() public void SubscribeModelToUI()
{ {
bindingEndpoint.Object.GetObservable(bindingEndpoint.Property).Subscribe(UpdateModelFromUI); this.bindingEndpoint.Object.GetObservable(this.bindingEndpoint.Property).Subscribe(this.UpdateModelFromUI);
} }
public void SubscribeUIToModel() public void SubscribeUIToModel()
{ {
sourceEndpoint.Changed.Subscribe(_ => UpdateUIFromModel()); this.sourceEndpoint.Changed.Subscribe(_ => this.UpdateUIFromModel());
UpdateUIFromModel(); this.UpdateUIFromModel();
} }
private void UpdateUIFromModel() private void UpdateUIFromModel()
{ {
object contextGetter = sourceEndpoint.Value; object contextGetter = this.sourceEndpoint.Value;
SetCompatibleValue(contextGetter, bindingEndpoint.Property.PropertyType, o => bindingEndpoint.Object.SetValue(bindingEndpoint.Property, o)); this.SetCompatibleValue(contextGetter, this.bindingEndpoint.Property.PropertyType, o => this.bindingEndpoint.Object.SetValue(this.bindingEndpoint.Property, o));
} }
private void SetCompatibleValue(object originalValue, Type targetType, Action<object> setValueFunc) private void SetCompatibleValue(object originalValue, Type targetType, Action<object> setValueFunc)
@ -64,7 +70,7 @@ namespace Perspex.Markup.Xaml.DataBinding
} }
else else
{ {
if (CanAssignWithoutConversion) if (this.CanAssignWithoutConversion)
{ {
setValueFunc(originalValue); setValueFunc(originalValue);
} }
@ -72,11 +78,11 @@ namespace Perspex.Markup.Xaml.DataBinding
{ {
var synchronizationOk = false; var synchronizationOk = false;
if (targetPropertyTypeConverter != null) if (this.targetPropertyTypeConverter != null)
{ {
if (targetPropertyTypeConverter.CanConvertTo(null, targetType)) if (this.targetPropertyTypeConverter.CanConvertTo(null, targetType))
{ {
object convertedValue = targetPropertyTypeConverter.ConvertTo(null, CultureInfo.InvariantCulture, originalValue, object convertedValue = this.targetPropertyTypeConverter.ConvertTo(null, CultureInfo.InvariantCulture, originalValue,
targetType); targetType);
if (convertedValue != null) if (convertedValue != null)
@ -89,7 +95,7 @@ namespace Perspex.Markup.Xaml.DataBinding
if (!synchronizationOk) if (!synchronizationOk)
{ {
LogCannotConvertError(originalValue); this.LogCannotConvertError(originalValue);
} }
} }
} }
@ -97,7 +103,7 @@ namespace Perspex.Markup.Xaml.DataBinding
private void UpdateModelFromUI(object valueFromUI) private void UpdateModelFromUI(object valueFromUI)
{ {
SetCompatibleValue(valueFromUI, sourceEndpoint.Type, o => sourceEndpoint.Value = o); this.SetCompatibleValue(valueFromUI, this.sourceEndpoint.Type, o => this.sourceEndpoint.Value = o);
} }
private void LogCannotConvertError(object value) private void LogCannotConvertError(object value)
@ -107,7 +113,7 @@ namespace Perspex.Markup.Xaml.DataBinding
var loggableValue = value.ToString(); var loggableValue = value.ToString();
var valueToWrite = string.IsNullOrWhiteSpace(loggableValue) ? "'(empty/whitespace string)'" : loggableValue; var valueToWrite = string.IsNullOrWhiteSpace(loggableValue) ? "'(empty/whitespace string)'" : loggableValue;
Debug.WriteLine("Cannot convert value {0} ({1}) to {2}", valueToWrite, value.GetType(), bindingEndpoint.Property.PropertyType); Debug.WriteLine("Cannot convert value {0} ({1}) to {2}", valueToWrite, value.GetType(), this.bindingEndpoint.Property.PropertyType);
} }
} }
} }

10
src/Markup/Perspex.Markup.Xaml/DataBinding/IPerspexPropertyBinder.cs

@ -1,11 +1,19 @@
namespace Perspex.Markup.Xaml.DataBinding // -----------------------------------------------------------------------
// <copyright file="IPerspexPropertyBinder.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding
{ {
using System.Collections.Generic; using System.Collections.Generic;
public interface IPerspexPropertyBinder public interface IPerspexPropertyBinder
{ {
XamlBinding GetBinding(PerspexObject po, PerspexProperty pp); XamlBinding GetBinding(PerspexObject po, PerspexProperty pp);
IEnumerable<XamlBinding> GetBindings(PerspexObject source); IEnumerable<XamlBinding> GetBindings(PerspexObject source);
XamlBinding Create(XamlBindingDefinition xamlBinding); XamlBinding Create(XamlBindingDefinition xamlBinding);
} }
} }

18
src/Markup/Perspex.Markup.Xaml/DataBinding/PerspexPropertyBinder.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.DataBinding // -----------------------------------------------------------------------
// <copyright file="PerspexPropertyBinder.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding
{ {
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -14,17 +20,17 @@
public PerspexPropertyBinder(ITypeConverterProvider typeConverterProvider) public PerspexPropertyBinder(ITypeConverterProvider typeConverterProvider)
{ {
this.typeConverterProvider = typeConverterProvider; this.typeConverterProvider = typeConverterProvider;
bindings = new HashSet<XamlBinding>(); this.bindings = new HashSet<XamlBinding>();
} }
public XamlBinding GetBinding(PerspexObject po, PerspexProperty pp) public XamlBinding GetBinding(PerspexObject po, PerspexProperty pp)
{ {
return bindings.First(xamlBinding => xamlBinding.Target == po && xamlBinding.TargetProperty == pp); return this.bindings.First(xamlBinding => xamlBinding.Target == po && xamlBinding.TargetProperty == pp);
} }
public IEnumerable<XamlBinding> GetBindings(PerspexObject source) public IEnumerable<XamlBinding> GetBindings(PerspexObject source)
{ {
return from binding in bindings return from binding in this.bindings
where binding.Target == source where binding.Target == source
select binding; select binding;
} }
@ -41,7 +47,7 @@
throw new InvalidOperationException(); throw new InvalidOperationException();
} }
var binding = new XamlBinding(typeConverterProvider) var binding = new XamlBinding(this.typeConverterProvider)
{ {
BindingMode = xamlBinding.BindingMode, BindingMode = xamlBinding.BindingMode,
SourcePropertyPath = xamlBinding.SourcePropertyPath, SourcePropertyPath = xamlBinding.SourcePropertyPath,
@ -49,7 +55,7 @@
TargetProperty = xamlBinding.TargetProperty TargetProperty = xamlBinding.TargetProperty
}; };
bindings.Add(binding); this.bindings.Add(binding);
return binding; return binding;
} }
} }

11
src/Markup/Perspex.Markup.Xaml/DataBinding/SourceBindingEndpoint.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="SourceBindingEndpoint.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding namespace Perspex.Markup.Xaml.DataBinding
{ {
using System; using System;
@ -6,8 +12,11 @@ namespace Perspex.Markup.Xaml.DataBinding
public class SourceBindingEndpoint public class SourceBindingEndpoint
{ {
public Type PropertyType { get; } public Type PropertyType { get; }
public INotifyPropertyChanged Source { get; } public INotifyPropertyChanged Source { get; }
public dynamic PropertyGetter { get; } public dynamic PropertyGetter { get; }
public Delegate PropertySetter { get; } public Delegate PropertySetter { get; }
public SourceBindingEndpoint(INotifyPropertyChanged source, Type propertyType, dynamic propertyGetter, Delegate propertySetter) public SourceBindingEndpoint(INotifyPropertyChanged source, Type propertyType, dynamic propertyGetter, Delegate propertySetter)
@ -15,7 +24,7 @@ namespace Perspex.Markup.Xaml.DataBinding
this.Source = source; this.Source = source;
this.PropertyType = propertyType; this.PropertyType = propertyType;
this.PropertyGetter = propertyGetter; this.PropertyGetter = propertyGetter;
this.PropertySetter = propertySetter; this.PropertySetter = propertySetter;
} }
} }
} }

11
src/Markup/Perspex.Markup.Xaml/DataBinding/TargetBindingEndpoint.cs

@ -1,14 +1,21 @@
// -----------------------------------------------------------------------
// <copyright file="TargetBindingEndpoint.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding namespace Perspex.Markup.Xaml.DataBinding
{ {
public class TargetBindingEndpoint public class TargetBindingEndpoint
{ {
public PerspexObject Object { get; } public PerspexObject Object { get; }
public PerspexProperty Property { get; } public PerspexProperty Property { get; }
public TargetBindingEndpoint(PerspexObject obj, PerspexProperty property) public TargetBindingEndpoint(PerspexObject obj, PerspexProperty property)
{ {
Object = obj; this.Object = obj;
Property = property; this.Property = property;
} }
} }
} }

37
src/Markup/Perspex.Markup.Xaml/DataBinding/XamlBinding.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.DataBinding // -----------------------------------------------------------------------
// <copyright file="XamlBinding.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding
{ {
using System; using System;
using System.Diagnostics; using System.Diagnostics;
@ -10,8 +16,11 @@
private readonly ITypeConverterProvider typeConverterProvider; private readonly ITypeConverterProvider typeConverterProvider;
public PerspexObject Target { get; set; } public PerspexObject Target { get; set; }
public PerspexProperty TargetProperty { get; set; } public PerspexProperty TargetProperty { get; set; }
public PropertyPath SourcePropertyPath { get; set; } public PropertyPath SourcePropertyPath { get; set; }
public BindingMode BindingMode { get; set; } public BindingMode BindingMode { get; set; }
public XamlBinding(ITypeConverterProvider typeConverterProvider) public XamlBinding(ITypeConverterProvider typeConverterProvider)
@ -28,34 +37,34 @@
try try
{ {
if (BindingMode == BindingMode.TwoWay) if (this.BindingMode == BindingMode.TwoWay)
{ {
var changeSynchronizer = new DataContextChangeSynchronizer( var changeSynchronizer = new DataContextChangeSynchronizer(
Target, this.Target,
TargetProperty, this.TargetProperty,
SourcePropertyPath, this.SourcePropertyPath,
dataContext, dataContext,
typeConverterProvider); this.typeConverterProvider);
changeSynchronizer.SubscribeUIToModel(); changeSynchronizer.SubscribeUIToModel();
changeSynchronizer.SubscribeModelToUI(); changeSynchronizer.SubscribeModelToUI();
} }
if (BindingMode == BindingMode.OneWay) if (this.BindingMode == BindingMode.OneWay)
{ {
var subscriptionHandler = new DataContextChangeSynchronizer( var subscriptionHandler = new DataContextChangeSynchronizer(
Target, this.Target,
TargetProperty, this.TargetProperty,
SourcePropertyPath, this.SourcePropertyPath,
dataContext, dataContext,
typeConverterProvider); this.typeConverterProvider);
subscriptionHandler.SubscribeUIToModel(); subscriptionHandler.SubscribeUIToModel();
} }
if (BindingMode == BindingMode.OneWayToSource) if (this.BindingMode == BindingMode.OneWayToSource)
{ {
var subscriptionHandler = new DataContextChangeSynchronizer(Target, TargetProperty, SourcePropertyPath, dataContext, typeConverterProvider); var subscriptionHandler = new DataContextChangeSynchronizer(this.Target, this.TargetProperty, this.SourcePropertyPath, dataContext, this.typeConverterProvider);
subscriptionHandler.SubscribeModelToUI(); subscriptionHandler.SubscribeModelToUI();
} }
} }

16
src/Markup/Perspex.Markup.Xaml/DataBinding/XamlBindingDefinition.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.DataBinding // -----------------------------------------------------------------------
// <copyright file="XamlBindingDefinition.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.DataBinding
{ {
using ChangeTracking; using ChangeTracking;
using Controls; using Controls;
@ -18,12 +24,12 @@
this.bindingMode = bindingMode; this.bindingMode = bindingMode;
} }
public Control Target => target; public Control Target => this.target;
public PerspexProperty TargetProperty => targetProperty; public PerspexProperty TargetProperty => this.targetProperty;
public PropertyPath SourcePropertyPath => sourcePropertyPath; public PropertyPath SourcePropertyPath => this.sourcePropertyPath;
public BindingMode BindingMode => bindingMode; public BindingMode BindingMode => this.bindingMode;
} }
} }

18
src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="BindingExtension.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.MarkupExtensions namespace Perspex.Markup.Xaml.MarkupExtensions
{ {
using System.Linq; using System.Linq;
@ -9,12 +15,12 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
public class BindingExtension : MarkupExtension public class BindingExtension : MarkupExtension
{ {
public BindingExtension() public BindingExtension()
{ {
} }
public BindingExtension(string path) public BindingExtension(string path)
{ {
Path = path; this.Path = path;
} }
public override object ProvideValue(MarkupExtensionContext extensionContext) public override object ProvideValue(MarkupExtensionContext extensionContext)
@ -28,14 +34,14 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
( (
target, target,
perspexProperty, perspexProperty,
new PropertyPath(Path), new PropertyPath(this.Path),
Mode == BindingMode.Default ? BindingMode.OneWay : Mode this.Mode == BindingMode.Default ? BindingMode.OneWay : this.Mode
); );
} }
/// <summary> The source path (for CLR bindings).</summary> /// <summary> The source path (for CLR bindings).</summary>
public string Path { get; set; } public string Path { get; set; }
public BindingMode Mode { get; set; } public BindingMode Mode { get; set; }
} }
} }

18
src/Markup/Perspex.Markup.Xaml/MarkupExtensions/TypeExtension.cs

@ -1,4 +1,10 @@
namespace Perspex.Markup.Xaml.MarkupExtensions // -----------------------------------------------------------------------
// <copyright file="TypeExtension.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.MarkupExtensions
{ {
using System; using System;
using Glass; using Glass;
@ -12,12 +18,12 @@
public Type Type { get; set; } public Type Type { get; set; }
public TypeExtension() public TypeExtension()
{ {
} }
public TypeExtension(Type type) public TypeExtension(Type type)
{ {
Type = type; this.Type = type;
} }
public string TypeName { get; set; } public string TypeName { get; set; }
@ -34,12 +40,12 @@
public override object ProvideValue(MarkupExtensionContext markupExtensionContext) public override object ProvideValue(MarkupExtensionContext markupExtensionContext)
{ {
if (Type != null) if (this.Type != null)
{ {
return Type; return this.Type;
} }
return ResolveFromString(TypeName, markupExtensionContext.TypeRepository); return this.ResolveFromString(this.TypeName, markupExtensionContext.TypeRepository);
} }
} }
} }

6
src/Markup/Perspex.Markup.Xaml/Templates/Template.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="Template.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Templates namespace Perspex.Markup.Xaml.Templates
{ {
public class Template public class Template

10
src/Markup/Perspex.Markup.Xaml/Templates/TemplateContent.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="TemplateContent.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Templates namespace Perspex.Markup.Xaml.Templates
{ {
using System.Collections.Generic; using System.Collections.Generic;
@ -18,9 +24,9 @@ namespace Perspex.Markup.Xaml.Templates
public Control Load() public Control Load()
{ {
var assembler = new PerspexObjectAssembler(context); var assembler = new PerspexObjectAssembler(this.context);
foreach (var xamlNode in nodes) foreach (var xamlNode in this.nodes)
{ {
assembler.Process(xamlNode); assembler.Process(xamlNode);
} }

6
src/Markup/Perspex.Markup.Xaml/Templates/TemplateLoader.cs

@ -1,3 +1,9 @@
// -----------------------------------------------------------------------
// <copyright file="TemplateLoader.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Templates namespace Perspex.Markup.Xaml.Templates
{ {
using System.Collections.Generic; using System.Collections.Generic;

19
src/Markup/Perspex.Markup.Xaml/Templates/XamlDataTemplate.cs

@ -1,26 +1,32 @@
// -----------------------------------------------------------------------
// <copyright file="XamlDataTemplate.cs" company="Steven Kirk">
// Copyright 2015 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Markup.Xaml.Templates namespace Perspex.Markup.Xaml.Templates
{ {
using System; using System;
using Controls.Templates; using Controls.Templates;
using OmniXaml.Attributes; using OmniXaml.Attributes;
using Controls; using Perspex.Controls;
[ContentProperty("Content")] [ContentProperty("Content")]
public class XamlDataTemplate : IDataTemplate public class XamlDataTemplate : IDataTemplate
{ {
private bool MyMatch(object data) private bool MyMatch(object data)
{ {
if (DataType == null) if (this.DataType == null)
{ {
throw new InvalidOperationException("XAML DataTemplates must have a DataType"); throw new InvalidOperationException("XAML DataTemplates must have a DataType");
} }
return DataType == data.GetType(); return this.DataType == data.GetType();
} }
private Control CreateVisualTreeForItem(object data) private Control CreateVisualTreeForItem(object data)
{ {
var visualTreeForItem = Content.Load(); var visualTreeForItem = this.Content.Load();
visualTreeForItem.DataContext = data; visualTreeForItem.DataContext = data;
return visualTreeForItem; return visualTreeForItem;
} }
@ -28,14 +34,15 @@ namespace Perspex.Markup.Xaml.Templates
public Type DataType { get; set; } public Type DataType { get; set; }
public TemplateContent Content { get; set; } public TemplateContent Content { get; set; }
public IControl Build(object param) public IControl Build(object param)
{ {
return CreateVisualTreeForItem(param); return this.CreateVisualTreeForItem(param);
} }
public bool Match(object data) public bool Match(object data)
{ {
return MyMatch(data); return this.MyMatch(data);
} }
} }
} }

1
src/Perspex.Animation/Perspex.Animation.csproj

@ -33,6 +33,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Animation.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Application/Perspex.Application.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Application.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Base/Perspex.Base.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Base.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Shared\SharedAssemblyInfo.cs"> <Compile Include="..\Shared\SharedAssemblyInfo.cs">

2
src/Perspex.Base/Threading/Dispatcher.cs

@ -1,4 +1,4 @@
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// <copyright file="Dispatcher.cs" company="Steven Kirk"> // <copyright file="Dispatcher.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information. // Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>

2
src/Perspex.Base/Threading/DispatcherTimer.cs

@ -1,4 +1,4 @@
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
// <copyright file="DispatcherTimer.cs" company="Steven Kirk"> // <copyright file="DispatcherTimer.cs" company="Steven Kirk">
// Copyright 2013 MIT Licence. See licence.md for more information. // Copyright 2013 MIT Licence. See licence.md for more information.
// </copyright> // </copyright>

13
src/Perspex.Controls/IContentControl.cs

@ -7,12 +7,25 @@ namespace Perspex.Controls
{ {
using Perspex.Layout; using Perspex.Layout;
/// <summary>
/// Defines a control that displays <see cref="Content"/> according to a
/// <see cref="Perspex.Controls.Templates.DataTemplate"/>.
/// </summary>
public interface IContentControl : IControl public interface IContentControl : IControl
{ {
/// <summary>
/// Gets or sets the content to display.
/// </summary>
object Content { get; set; } object Content { get; set; }
/// <summary>
/// Gets or sets the horizontal alignment of the content within the control.
/// </summary>
HorizontalAlignment HorizontalContentAlignment { get; set; } HorizontalAlignment HorizontalContentAlignment { get; set; }
/// <summary>
/// Gets or sets the vertical alignment of the content within the control.
/// </summary>
VerticalAlignment VerticalContentAlignment { get; set; } VerticalAlignment VerticalContentAlignment { get; set; }
} }
} }

7
src/Perspex.Controls/IGlobalDataTemplates.cs

@ -6,11 +6,16 @@
namespace Perspex.Controls namespace Perspex.Controls
{ {
using System.Collections.Generic;
using Perspex.Controls.Templates; using Perspex.Controls.Templates;
/// <summary>
/// Defines the application-global data templates.
/// </summary>
public interface IGlobalDataTemplates public interface IGlobalDataTemplates
{ {
/// <summary>
/// Gets the application-global data templates.
/// </summary>
DataTemplates DataTemplates { get; } DataTemplates DataTemplates { get; }
} }
} }

6
src/Perspex.Controls/IHeadered.cs

@ -6,8 +6,14 @@
namespace Perspex.Controls namespace Perspex.Controls
{ {
/// <summary>
/// Defines a headered object.
/// </summary>
public interface IHeadered public interface IHeadered
{ {
/// <summary>
/// Gets or set the header.
/// </summary>
object Header { get; set; } object Header { get; set; }
} }
} }

3
src/Perspex.Controls/Perspex.Controls.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Controls.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Shared\SharedAssemblyInfo.cs"> <Compile Include="..\Shared\SharedAssemblyInfo.cs">
@ -45,6 +46,7 @@
<Compile Include="IControl.cs" /> <Compile Include="IControl.cs" />
<Compile Include="IReparentingHost.cs" /> <Compile Include="IReparentingHost.cs" />
<Compile Include="ISetLogicalParent.cs" /> <Compile Include="ISetLogicalParent.cs" />
<Compile Include="ItemsPanelTemplate.cs" />
<Compile Include="MenuItemAccessKeyHandler.cs" /> <Compile Include="MenuItemAccessKeyHandler.cs" />
<Compile Include="Mixins\SelectableMixin.cs" /> <Compile Include="Mixins\SelectableMixin.cs" />
<Compile Include="Parsers\GridLengthsParser.cs" /> <Compile Include="Parsers\GridLengthsParser.cs" />
@ -110,7 +112,6 @@
<Compile Include="Image.cs" /> <Compile Include="Image.cs" />
<Compile Include="Generators\IItemContainerGenerator.cs" /> <Compile Include="Generators\IItemContainerGenerator.cs" />
<Compile Include="ItemsControl.cs" /> <Compile Include="ItemsControl.cs" />
<Compile Include="ItemsPanelTemplate.cs" />
<Compile Include="Presenters\ItemsPresenter.cs" /> <Compile Include="Presenters\ItemsPresenter.cs" />
<Compile Include="Panel.cs" /> <Compile Include="Panel.cs" />
<Compile Include="Primitives\ScrollBarVisibility.cs" /> <Compile Include="Primitives\ScrollBarVisibility.cs" />

1
src/Perspex.Diagnostics/Perspex.Diagnostics.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Diagnostics.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Input/Perspex.Input.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Input.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Interactivity/Perspex.Interactivity.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Interactivity.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Layout/Perspex.Layout.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Layout.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.SceneGraph/Perspex.SceneGraph.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.SceneGraph.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Perspex.Styling/Perspex.Styling.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Styling.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Compile Include="..\Shared\SharedAssemblyInfo.cs"> <Compile Include="..\Shared\SharedAssemblyInfo.cs">

1
src/Perspex.Themes.Default/Perspex.Themes.Default.csproj

@ -35,6 +35,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Themes.Default.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->

1
src/Windows/Perspex.Direct2D1/Perspex.Direct2D1.csproj

@ -31,6 +31,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Direct2D1.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="SharpDX, Version=2.6.3.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL"> <Reference Include="SharpDX, Version=2.6.3.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">

1
src/Windows/Perspex.Win32/Perspex.Win32.csproj

@ -31,6 +31,7 @@
<DefineConstants>TRACE</DefineConstants> <DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<DocumentationFile>bin\Release\Perspex.Win32.XML</DocumentationFile>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Splat, Version=1.6.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Splat, Version=1.6.2.0, Culture=neutral, processorArchitecture=MSIL">

Loading…
Cancel
Save