Skip to content

Instantly share code, notes, and snippets.

@ldfallas
Created January 31, 2011 10:48
Show Gist options
  • Save ldfallas/803888 to your computer and use it in GitHub Desktop.
Save ldfallas/803888 to your computer and use it in GitHub Desktop.
test.xaml
import clr
clr.AddReference("PresentationCore")
clr.AddReference("PresentationFramework")
clr.AddReference("WindowsBase")
clr.AddReference('GalaSoft.MvvmLight.WPF4.dll')
from System.Windows.Markup import XamlReader
from System.Windows import Application
from System.Windows import MessageBox
from System.IO import File
from System.Windows.Controls import TreeView
import System
import clrtype
from GalaSoft.MvvmLight import ViewModelBase
from GalaSoft.MvvmLight.Command import RelayCommand
from System.Collections.ObjectModel import ObservableCollection
class TestModel(ViewModelBase):
__metaclass__ = clrtype.ClrClass
def __init__(self):
self.name = 'algo'
self.root = NodeModel('x1',[NodeModel('y2',[NodeModel('z2',[])]),
NodeModel('y3',[])])
self.sselected = NodeModel('???',[])
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def selected(self):
print('rra ' )
result = self.sselected
print('rra 2' )
return result
@selected.setter
@clrtype.accepts(System.Object)
@clrtype.returns()
def selected(self, value):
print('xxx ')
self.sselected = value
#self.RaisePropertyChanged('selected')
print('3xxx')
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def Roots(self):
return [self.root]
@property
@clrtype.accepts()
@clrtype.returns(System.String)
def Label(self):
print('a')
return self.name
@Label.setter
@clrtype.accepts(System.String)
@clrtype.returns()
def Label(self, value):
print('b')
self.name = value
print('c')
self.RaisePropertyChanged('Label')
print('d')
class MenuItemOptionModel:
__metaclass__ = clrtype.ClrClass
def __init__(self,header, action):
self.header = header
self.action = action
@property
@clrtype.accepts()
@clrtype.returns(System.String)
def header_text(self):
return self.header
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def ctxt_action(self):
return self.action
class NodeModel:
__metaclass__ = clrtype.ClrClass
def __init__(self,label, initchildren):
self.children = ObservableCollection[System.Object](initchildren)
self.name = label
self.menu_items_col = [MenuItemOptionModel('One', RelayCommand(lambda: MessageBox.Show(self.name)))]
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def Label(self):
return self.name
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def menu_items(self):
return self.menu_items_col
@property
@clrtype.accepts()
@clrtype.returns(System.Object)
def Children(self):
return self.children
xamlFile = File.OpenRead('test.xaml')
window = XamlReader.Load(xamlFile)
window.DataContext = TestModel()
xamlFile.Close()
Application().Run(window)
using System.Windows.Markup;
using System.Windows;
using System.Windows.Controls;
using System.IO;
using GalaSoft.MvvmLight;
using System.Collections.ObjectModel;
namespace Langexplr
{
public static class TreeViewSelectedBehavior
{
public static readonly DependencyProperty MySelectedProperty =
System.Windows.DependencyProperty.RegisterAttached(
"MySelected",
typeof(object),
typeof(TreeViewSelectedBehavior)
);
public static object GetMySelected(TreeView t)
{
System.Console.WriteLine("1z");
return t.GetValue(MySelectedProperty);
System.Console.WriteLine("1z");
}
public static void SetMySelected(TreeView t, object theValue)
{
System.Console.WriteLine("1y");
t.SetValue(MySelectedProperty, theValue);
System.Console.WriteLine("1y");
}
public static readonly DependencyProperty SelectedHelperProperty =
System.Windows.DependencyProperty.RegisterAttached(
"SelectedHelper",
typeof(TreeViewSelectedHelper),
typeof(TreeViewSelectedBehavior),
new UIPropertyMetadata(null,OnSelectedHelperChanged)
);
public static TreeViewSelectedHelper GetSelectedHelper(TreeView t)
{
return (TreeViewSelectedHelper)t.GetValue(SelectedHelperProperty);
}
public static void SetSelectedHelper(TreeView t,
TreeViewSelectedHelper theValue)
{
t.SetValue(SelectedHelperProperty, theValue);
}
static void OnSelectedHelperChanged(
DependencyObject depObj,
DependencyPropertyChangedEventArgs e)
{
System.Console.WriteLine("1x");
((TreeViewSelectedHelper)e.NewValue).Register((TreeView)depObj);
System.Console.WriteLine("2x");
}
}
public class TreeViewSelectedHelper
{
public TreeViewSelectedHelper() {System.Console.WriteLine("Created"); }
void SelectedItemChanged(object sender,
RoutedPropertyChangedEventArgs<object> args)
{
System.Console.WriteLine("1");
(sender as TreeView).SetValue(TreeViewSelectedBehavior.MySelectedProperty,((sender as TreeView)).SelectedItem);
System.Console.WriteLine("2");
}
public void Register(TreeView t)
{
t.SelectedItemChanged += SelectedItemChanged;
}
}
}
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:utils="clr-namespace:Langexplr;assembly=utils"
Title="Little query" Width="300" Height="300">
<Window.Resources>
<utils:TreeViewSelectedHelper x:Key="selHelper" />
</Window.Resources>
<StackPanel>
<TextBlock Text="??"/>
<TreeView ItemsSource="{Binding Roots}"
utils:TreeViewSelectedBehavior.SelectedHelper="{StaticResource selHelper}">
<utils:TreeViewSelectedBehavior.MySelected>
<Binding Path="selected" Mode="OneWayToSource"/>
</utils:TreeViewSelectedBehavior.MySelected>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu ItemsSource="{Binding menu_items}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding ctxt_action}"/>
</Style>
</ContextMenu.ItemContainerStyle>
<ContextMenu.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding header_text}"/>
</DataTemplate>
</ContextMenu.ItemTemplate>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<!-- <HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate.ItemContainerStyle>-->
<TextBlock Text="{Binding Label}">
</TextBlock>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
<Button>Ok</Button>
</StackPanel>
</Window>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment