<TextBox Text="{Binding TextToDisplay}">
This XAML code says that the value of the
Text
property is bound to the TextToDisplay
property of the of the object specified by the DataContext
property.As with other Silverlight features data binding requires you to use a .NET object with properties. We can use clrtype to take advantage of this feature with IronPython.
For example, say that we want to bind a text property to a Python object to a TextBox:
<UserControl x:Class="System.Windows.Controls.UserControl"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel Width="300" x:Name="layout_root" Background="White">
<TextBox x:Name="my_text_box"
Text="{Binding text_to_display, Mode=TwoWay}" />
<Button x:Name="my_button" Content="Show text"/>
</StackPanel>
</UserControl>
The
app.py
file looks like this:
from System.Windows import Application
from System.Windows.Controls import UserControl
import System
import clrtype
from System.Windows import MessageBox
class MyData:
__metaclass__ = clrtype.ClrClass
def __init__(self):
self.text = 'Initial text'
@property
@clrtype.accepts()
@clrtype.returns(System.String)
def text_to_display(self): return self.text
@text_to_display.setter
@clrtype.accepts(System.String)
@clrtype.returns()
def text_to_display(self, value):
self.text = value
class App:
def handle_click(self, sender, event_args):
MessageBox.Show(self.data.text)
def __init__(self):
self.data = MyData()
self.root = Application.Current.LoadRootVisual(UserControl(), "app.xaml")
self.root.my_text_box.DataContext = self.data
self.root.my_button.Click += lambda s,ea: self.handle_click(s,ea)
theApp = App()
Here the definition of
MyData
is decorated with the information on how to generate the .NET class elements to be exposed .Since the binding is declarated as
TwoWay
modifications to the TextBox
are reflected in the data
instance.As with Part I and Part II of these series, IronPython 2.7 beta 1 is used for all examples.