[Ironpython-users] [Fwd: RE: How do I get access to the objects of this class which is loaded XAML]

sepatan at sibmail.com sepatan at sibmail.com
Fri May 18 06:44:20 CEST 2012


Hello, Pascal.
 Thank you for your help. Working. Used wpf.LoadComponent.
 Here is the complete code (case study). Can anyone come in handy.
 Still, I would like to know whether it is possible to determine the XAML
namespace environment in which IronPython loaded XAML (for example
because: xmlns: nspy = "clr-namespace: MyXAML_Py;")?

1) module proba.py:

import wpf
import clr
import clrtype
import System
from System.Windows import Application, Window, MessageBox

class IProduct(object):
	__metaclass__ = clrtype.ClrInterface

	_clrnamespace = "IronPython.Samples.ClrType"

	@property
	@clrtype.accepts()
	@clrtype.returns(str)
	def Name(self): raise RuntimeError("this should not get called")

	@property
	@clrtype.accepts()
	@clrtype.returns(float)
	def Cost(self): raise RuntimeError("this should not get called")

	@clrtype.accepts()
	@clrtype.returns(bool)
	def IsAvailable(self): raise RuntimeError("this should not get called")

class Product(IProduct):
	__metaclass__ = clrtype.ClrClass

	_clrnamespace = "IronPython.Samples.ClrType"

	_clrfields = {
		"name":str,
		"cost":float,
		"_quantity":int
	}

	CLSCompliant = clrtype.attribute(System.CLSCompliantAttribute)
	clr.AddReference("System.Xml")
	XmlRoot = clrtype.attribute(System.Xml.Serialization.XmlRootAttribute)

	_clrclassattribs = [
		# Use System.Attribute subtype directly for custom attributes without
arguments
		System.ObsoleteAttribute,
		# Use clrtype.attribute for custom attributes with arguments (either
positional, named, or both)
		CLSCompliant(False),
		XmlRoot("product", Namespace="www.contoso.com")
	]

	def __init__(self, name, cost, quantity):
		self.name = name
		self.cost = cost
		self._quantity = quantity

	# IProduct methods
	def Name(self): return self.name
	def Cost(self): return self.cost
	def IsAvailable(self): return self.quantity != 0

	@property
	@clrtype.accepts()
	@clrtype.returns(int)
	def quantity(self): return self._quantity

	@quantity.setter
	@clrtype.accepts(int)
	@clrtype.returns()
	def quantity(self, value): self._quantity = value

	@clrtype.accepts(float)
	@clrtype.returns(float)
	def calc_total(self, discount = 0.0):
		return (self.cost - discount) * self.quantity

p = Product("SergIv", 10.0, 42)
class MyWindow(Window):
	global p
	def __init__(self):
		Cont=wpf.LoadComponent(self, 'proba.xaml')
		Cont.DataContext = p

	def button1_Click(self, sender, e):
		MessageBox.Show(p.name)



if __name__ == '__main__':
	Application().Run(MyWindow())

2) file proba.xaml:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <Button Name="cnop" Content="Button" Height="50"
HorizontalAlignment="Left" Margin="19,64,0,0"
VerticalAlignment="Top" Width="148" Click="button1_Click"/>
        <Label Content="{Binding Path=name}" Height="33"
HorizontalAlignment="Left" Margin="20,12,0,0"
VerticalAlignment="Top" Width="244" Name="Lab1"/>
    </Grid>
</Window>

>===================================================================
> To enable Data binding you need to set the DataContext property of the
> object loaded from xaml
>
> you could do something like this
> sr = StreamReader(path)
> userCtrl = XamlReader.Load(sr.BaseStream)
> Content = userCtrl
> userCtrl.DataContext = self
>
> -----Original Message-----
> From: ironpython-users-bounces+pascal=travobject.com at python.org
> [mailto:ironpython-users-bounces+pascal=travobject.com at python.org] On
> Behalf
> Of sepatan at sibmail.com
> Sent: May-17-12 11:43 AM
> To: ironpython-users at python.org
> Subject: [Ironpython-users] [Fwd: RE: How do I get access to the objects
> of
> this class which is loaded XAML]
>
> Hello,
> That is, if the load XAML, as specified below, the Label (Lab1) can be
> binding on the CLR type (p.name) is defined in proba.py (do not forget
> that
> the code is the XAML load in proba.py)?
>
> --------------------------- Original Message ---------------------------
> Тема:  RE: [Ironpython-users] How do I get access to the objects of this
> class which is loaded XAML
> От:    "Pascal Normandin" <pascal at travobject.com>
> Дата:  Чтв, Май 17, 2012 21:50
> Кому:  sepatan at sibmail.com
>        ironpython-users at python.org
> --------------------------------------------------------------------------
>
> Hello,
>
> I'm not sure about the LoadComponent method but I have used the
> XamlReader.Parse(xaml) and it works well for me.
>
> Using something like
>
> sr = StreamReader(path)
> userCtrl = XamlReader.Load(sr.BaseStream) Content = userCtrl
>
> Hope that helps;
> Pascal
>
> -----Original Message-----
> From: ironpython-users-bounces+pascal=travobject.com at python.org
> [mailto:ironpython-users-bounces+pascal=travobject.com at python.org] On
> Behalf
> Of sepatan at sibmail.com
> Sent: May-17-12 6:40 AM
> To: ironpython-users at python.org
> Subject: [Ironpython-users] How do I get access to the objects of this
> class
> which is loaded XAML
>
> How do I get access to the objects of this class which is loaded XAML.
> Given that the objects are presented to the CLR types?
>  What namespace should be specified?
>  The text below gives an error.
>
> 1) module proba.py:
> ....................................
> import WPF
> class MyWindow(Window):
> # p - CLR type, has a property name
> 	global p
> 	def __init__(self):
> 		wpf.LoadComponent(self, 'proba.xaml')
>
> 	def button1_Click(self, sender, e):
> 		MessageBox.Show(p.name)
> ....................................
> not the entire text of the program
>
> 2) file proba.xaml:
> <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
>         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
> <!-- This part discusses the -->
>         xmlns:local="clr-namespace:proba"
> <!-- .................. -->
>         Title="Window1" Height="300" Width="300">
>     <Grid>
>         <Button Name="cnop" Click="button1_Click"/>
>         <Label Content="{Binding Source={x1:p}, Path=name}" Height="33"
> HorizontalAlignment="Left" Margin="20,12,0,0"
> VerticalAlignment="Top" Width="244" Name="Lab1"/>
>     </Grid>
> </Window>
>
> _______________________________________________
> Ironpython-users mailing list
> Ironpython-users at python.org
> http://mail.python.org/mailman/listinfo/ironpython-users
>
>
>
> _______________________________________________
> Ironpython-users mailing list
> Ironpython-users at python.org
> http://mail.python.org/mailman/listinfo/ironpython-users
>
>




More information about the Ironpython-users mailing list