Browse Source

Make TreeDataTemplate work.

pull/237/head
Steven Kirk 11 years ago
parent
commit
92535c3904
  1. 4
      samples/XamlTestApplication/Views/MainWindow.paml
  2. 1
      src/Markup/Perspex.Markup.Xaml/Context/PerspexObjectAssembler.cs
  3. 64
      src/Markup/Perspex.Markup.Xaml/Context/PerspexXamlMemberValuePlugin.cs
  4. 8
      src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs

4
samples/XamlTestApplication/Views/MainWindow.paml

@ -70,14 +70,14 @@
</StackPanel>
</DropDown>
<TreeView Items="{Binding Nodes}">
<!--<TreeView.DataTemplates>
<TreeView.DataTemplates>
<TreeDataTemplate DataType="vm:TestNode" ItemsSource="{Binding Children}">
<StackPanel>
<TextBlock Text="{Binding Header}" FontSize="24"/>
<TextBlock Text="{Binding SubHeader}"/>
</StackPanel>
</TreeDataTemplate>
</TreeView.DataTemplates>-->
</TreeView.DataTemplates>
</TreeView>
</StackPanel>
</TabItem>

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

@ -16,6 +16,7 @@ namespace Perspex.Markup.Xaml.Context
{
var mapping = new DeferredLoaderMapping();
mapping.Map<DataTemplate>(template => template.Content, new TemplateLoader());
mapping.Map<TreeDataTemplate>(template => template.Content, new TemplateLoader());
var assembler = new ObjectAssembler(wiringContext, new TopDownValueContext(), objectAssemblerSettings);
_objectAssembler = new TemplateHostingObjectAssembler(assembler, mapping);

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

@ -4,6 +4,7 @@
using System;
using System.Linq;
using System.Reactive.Linq;
using System.Reflection;
using Glass;
using OmniXaml.ObjectAssembler;
using OmniXaml.Typing;
@ -57,39 +58,46 @@ namespace Perspex.Markup.Xaml.Context
private void HandleXamlBindingDefinition(object instance, XamlBindingDefinition def)
{
var perspexObject = instance as PerspexObject;
if (perspexObject == null)
if (_xamlMember.XamlType.UnderlyingType == typeof(XamlBindingDefinition))
{
throw new InvalidOperationException(
$"Cannot bind to an object of type '{instance.GetType()}");
}
// TODO: This should search base classes.
var property = instance.GetType().GetTypeInfo().GetDeclaredProperty(_xamlMember.Name);
var property = perspexObject.GetRegisteredProperties()
.FirstOrDefault(x => x.Name == _xamlMember.Name);
if (property == null || !property.CanWrite)
{
throw new InvalidOperationException(
$"Cannot assign to '{_xamlMember.Name}' on '{instance.GetType()}");
}
if (property == null)
{
throw new InvalidOperationException(
$"Cannot find '{_xamlMember.Name}' on '{instance.GetType()}");
property.SetValue(instance, def);
}
var binding = new XamlBinding(_propertyBinder.TypeConverterProvider)
else
{
BindingMode = def.BindingMode,
SourcePropertyPath = def.SourcePropertyPath,
};
binding.Bind(perspexObject, property);
}
private void BindToDataContextWhenItsSet(XamlBindingDefinition definition)
{
// var target = definition.Target;
// var dataContext = target.DataContext;
// var binding = _propertyBinder.GetBinding(target, definition.TargetProperty);
// binding.BindToDataContext(dataContext);
var perspexObject = instance as PerspexObject;
if (perspexObject == null)
{
throw new InvalidOperationException(
$"Cannot bind to an object of type '{instance.GetType()}");
}
var property = perspexObject.GetRegisteredProperties()
.FirstOrDefault(x => x.Name == _xamlMember.Name);
if (property == null)
{
throw new InvalidOperationException(
$"Cannot find '{_xamlMember.Name}' on '{instance.GetType()}");
}
var binding = new XamlBinding(_propertyBinder.TypeConverterProvider)
{
BindingMode = def.BindingMode,
SourcePropertyPath = def.SourcePropertyPath,
};
binding.Bind(perspexObject, property);
}
}
// ReSharper disable once MemberCanBePrivate.Global

8
src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs

@ -3,9 +3,10 @@
using System;
using System.Collections;
using OmniXaml.Attributes;
using System.Reactive.Linq;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Markup.Binding;
using Perspex.Markup.Xaml.Binding;
namespace Perspex.Markup.Xaml.Templates
@ -14,7 +15,7 @@ namespace Perspex.Markup.Xaml.Templates
{
public Type DataType { get; set; }
public TemplateContent Content { get; set; }
public XamlBinding ItemsSource { get; set; }
public XamlBindingDefinition ItemsSource { get; set; }
public bool Match(object data)
{
@ -30,7 +31,8 @@ namespace Perspex.Markup.Xaml.Templates
{
if (ItemsSource != null)
{
// TODO: Get value of ItemsSource here.
var obs = new ExpressionObserver(item, ItemsSource.SourcePropertyPath);
return obs.Take(1).Wait().Value as IEnumerable;
}
return null;

Loading…
Cancel
Save