Browse Source

Started implementing TreeDataTemplate.

Binding system needs to be updated first.
pull/237/head
Steven Kirk 11 years ago
parent
commit
5cd27f7e8f
  1. 36
      samples/XamlTestApplication/ViewModels/MainWindowViewModel.cs
  2. 26
      samples/XamlTestApplication/Views/MainWindow.paml
  3. 14
      samples/XamlTestApplication/Views/TestNode.cs
  4. 1
      samples/XamlTestApplication/XamlTestApplication.csproj
  5. 1
      src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj
  6. 8
      src/Markup/Perspex.Markup.Xaml/Templates/DataTemplate.cs
  7. 52
      src/Markup/Perspex.Markup.Xaml/Templates/TreeDataTemplate.cs

36
samples/XamlTestApplication/ViewModels/MainWindowViewModel.cs

@ -15,8 +15,44 @@ namespace XamlTestApplication.ViewModels
{
Items.Add(new TestItem($"Item {i}", $"Item {i} Value"));
}
Nodes = new List<TestNode>
{
new TestNode
{
Header = "Root",
SubHeader = "Root Item",
Children = new[]
{
new TestNode
{
Header = "Child 1",
SubHeader = "Child 1 Value",
},
new TestNode
{
Header = "Child 2",
SubHeader = "Child 2 Value",
Children = new[]
{
new TestNode
{
Header = "Grandchild",
SubHeader = "Grandchild Value",
},
new TestNode
{
Header = "Grandmaster Flash",
SubHeader = "White Lines",
},
}
},
}
}
};
}
public List<TestItem> Items { get; }
public List<TestNode> Nodes { get; }
}
}

26
samples/XamlTestApplication/Views/MainWindow.paml

@ -60,16 +60,26 @@
</DataTemplate>
</ListBox.DataTemplates>
</ListBox>
<DropDown VerticalAlignment="Center">
<DropDown VerticalAlignment="Center">
<StackPanel>
<TextBlock Text="Item 1" FontSize="24" />
<TextBlock Text="Item 1 Value" />
</StackPanel>
<StackPanel>
<TextBlock Text="Item 2" FontSize="24" />
<TextBlock Text="Item 2 Value" />
</StackPanel>
</DropDown>
<TreeView Items="{Binding Nodes}">
<TreeView.DataTemplates>
<TreeDataTemplate DataType="vm:TestNode" ItemsSource="{Binding Children}">
<StackPanel>
<TextBlock Text="Item 1" FontSize="24" />
<TextBlock Text="Item 1 Value" />
</StackPanel>
<StackPanel>
<TextBlock Text="Item 2" FontSize="24" />
<TextBlock Text="Item 2 Value" />
<TextBlock Text="{Binding Header}" FontSize="24"/>
<TextBlock Text="{Binding SubHeader}"/>
</StackPanel>
</DropDown>
</TreeDataTemplate>
</TreeView.DataTemplates>
</TreeView>
</StackPanel>
</TabItem>
<TabItem Header="Layout">

14
samples/XamlTestApplication/Views/TestNode.cs

@ -0,0 +1,14 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System.Collections.Generic;
namespace XamlTestApplication.ViewModels
{
public class TestNode
{
public string Header { get; set; }
public string SubHeader { get; set; }
public IEnumerable<TestNode> Children { get; set; }
}
}

1
samples/XamlTestApplication/XamlTestApplication.csproj

@ -80,6 +80,7 @@
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="ViewModels\MainWindowViewModel.cs" />
<Compile Include="Views\TestNode.cs" />
<Compile Include="ViewModels\TestItem.cs" />
<Compile Include="Views\MainWindow.cs" />
</ItemGroup>

1
src/Markup/Perspex.Markup.Xaml/Perspex.Markup.Xaml.csproj

@ -245,6 +245,7 @@
<Compile Include="Context\PerspexXamlType.cs" />
<Compile Include="Templates\DataTemplate.cs" />
<Compile Include="PerspexXamlLoader.cs" />
<Compile Include="Templates\TreeDataTemplate.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />

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

@ -12,7 +12,6 @@ namespace Perspex.Markup.Xaml.Templates
public class DataTemplate : IDataTemplate
{
public Type DataType { get; set; }
public TemplateContent Content { get; set; }
public bool Match(object data)
@ -25,12 +24,7 @@ namespace Perspex.Markup.Xaml.Templates
return DataType == data.GetType();
}
public IControl Build(object param)
{
return CreateVisualTreeForItem(param);
}
private Control CreateVisualTreeForItem(object data)
public IControl Build(object data)
{
var visualTreeForItem = Content.Load();
visualTreeForItem.DataContext = data;

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

@ -0,0 +1,52 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Collections;
using OmniXaml.Attributes;
using Perspex.Controls;
using Perspex.Controls.Templates;
using Perspex.Markup.Xaml.DataBinding;
namespace Perspex.Markup.Xaml.Templates
{
[ContentProperty("Content")]
public class TreeDataTemplate : ITreeDataTemplate
{
public Type DataType { get; set; }
public TemplateContent Content { get; set; }
public XamlBinding ItemsSource { get; set; }
public bool Match(object data)
{
if (DataType == null)
{
throw new InvalidOperationException("DataTemplate must have a DataType.");
}
return DataType == data.GetType();
}
public IEnumerable ItemsSelector(object item)
{
if (ItemsSource != null)
{
// TODO: Get value of ItemsSource here.
}
return null;
}
public bool IsExpanded(object item)
{
return true;
}
public IControl Build(object data)
{
var visualTreeForItem = Content.Load();
visualTreeForItem.DataContext = data;
return visualTreeForItem;
}
}
}
Loading…
Cancel
Save