This looks very promising but I cannot make it work. I have changed product.py in DevHawk's example to:

#from clrtypeold import ClrMetaclass
import clrtype

class Product(object):
 #__metaclass__ = ClrMetaclass
 __metaclass__ = clrtype.ClrClass
 _clrnamespace = "DevHawk.IronPython.ClrTypeSeries"
 #_clrproperties = {
   #"name":str,
   #"cost":float,
   #"quantity":int,
   #}
def __init__(self, name, cost, quantity):
   self.name = name
   self.cost = cost
   self.quantity = quantity
def calc_total(self):
   return self.cost * self.quantity

 @property
 @clrtype.accepts()
 @clrtype.returns(str)
 def name(self):
     return self._name

 @name.setter
 @clrtype.accepts(str)
 @clrtype.returns()
 def name(self, value):
     self._name = value


When I run it I don't see any items in the listbox. When I check the name, it is a property:

py> a.root.listbox1.Items[0]

=> <Product object at 0x000000000000002B>

py> a.root.listbox1.Items[0].GetType().GetProperties()

=> Array[PropertyInfo]((<System.Reflection.RuntimePropertyInfo object at 
0x000000000000002C [System.String name]>))

Whe I used the old clrtype with _clrproperties = {'name': str, ...}, it worked.

--
-- Lukáš


Shri Borde wrote:

Here is an updated version of clrtype.py that uses @property + @clrtype.accepts/@clrtype.returns to indicate a CLR property, instead of using "_clrproperties". I think its more Pythonic in general, but also you should be able to modify @notify_property to work with it.

Note that notify_property won't just work. You will have to change it to propagate the func_name, arg_types, and return_type properties from the old getter/setter function objects to the new getter/setter function objects since these values are used by clrtype to generate the CLR members. Something like this:

class notify_property(property):

    def propagate_attributes(old_function, new_function):

        new_function.func_name = old_function.func_name

        new_function.arg_types = old_function.arg_types

        new_function.return_type = old_function.return_type

    def __init__(self, getter):

        def newgetter(slf):

            try:

                return getter(slf)

            except AttributeError:

                return None

        propagate_attributes(getter, newgetter)

        super(notify_property, self).__init__(newgetter)

    def setter(self, setter):

        def newsetter(slf, newvalue):

            oldvalue = self.fget(slf)

            if oldvalue != newvalue:

                setter(slf, newvalue)

                slf.OnPropertyChanged(setter.__name__)

        propagate_attributes(setter, newsetter)

        return property(

            fget=self.fget,

            fset=newsetter,

            fdel=self.fdel,

            doc=self.__doc__)

*From:* Lukas Cenovsky [mailto:[email protected]]
*Sent:* Thursday, November 12, 2009 11:01 AM
*To:* Shri Borde
*Subject:* Re: [IronPython] .NET attributes for methods

Shri Borde wrote:

So the new clrtype.py still works - cool!

Yep ;-)

I am not an expert on data binding, so I don't have any suggestions. Why do you say that the decorator approach will not work with Silverlight? Does @notifiy_property from http://gui-at.blogspot.com/2009/11/inotifypropertychanged-in-ironpython.html use any feature not available in Silverlight?

It does not (as far as I know because it is pure IronPython). But @notify_property does not work with clrtypes:

class ViewModel(NotifyPropertyChangedBase):
    __metaclass__ = clrtype.ClrMetaclass
    _clrnamespace = "Cenda.ViewModel"
    _clrproperties = {'size': str}
def __init__(self):
        super(ViewModel, self).__init__()
        # must be string to two-way binding work correctly
        self.size = '10'
@notify_property
    def size(self):
        return self._size
@size.setter
    def size(self, value):
        self._size = value
        print 'Size changed to %r' % self.size

When I run this code, the size is still clr property and Python getter and setter are not run.

So basically I need to override/enhance clr getter and setter created by clrtype._clrproperties.

--
-- Lukáš


*From:* Lukas Cenovsky [mailto:[email protected]]
*Sent:* Thursday, November 12, 2009 8:09 AM
*To:* Shri Borde
*Subject:* Re: [IronPython] .NET attributes for methods

Thanks, that works!

What do you think would be the best approach to create notifiable properties for Silverlight? I did it for WPF (via decorators: http://gui-at.blogspot.com/2009/11/inotifypropertychanged-in-ironpython.html) but it seems to me it won't be possible to do it similarly for Silverlight...

--
-- Lukáš

Shri Borde wrote:

Can you use "_clrproperties" instead of "_clrfields"? DevHawk's same created a field and a property even when you just used "_clrfields". I don't do that anymore. So you will need to use "_clrproperties" to get properties, which SL must use for data binding.

*From:* [email protected] <mailto:[email protected]> [mailto:[email protected]] *On Behalf Of *Lukas Cenovsky
*Sent:* Wednesday, November 11, 2009 2:37 AM
*To:* Discussion of IronPython
*Subject:* Re: [IronPython] .NET attributes for methods

I did change __metaclass__ to ClrMetaclass. See the attached source I use for testing - the only difference is to comment/uncomment appropriate part in product.py.

The outputs look the same, there are no visible exceptions:

DevHawk:

py> a.root.FindName('listbox1').ItemsSource[0].GetType().GetFields()
=> Array[FieldInfo]((<System.Reflection.RtFieldInfo object at 0x000000000000002B 
[Double cost]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002C [Int32 quantity]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002D [System.String 
name]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002E 
[IronPython.Runtime.Types.PythonType .class]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002F 
[IronPython.Runtime.PythonDictionary .dict]>,
<System.Reflection.RtFieldInfo object at 0x0000000000000030 [System.Object[] 
.slots_and_weakref]>))


Shri:

py> a.root.FindName('listbox1').ItemsSource[0].GetType().GetFields()
=> Array[FieldInfo]((<System.Reflection.RtFieldInfo object at 0x000000000000002B 
[Double cost]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002C [Int32 quantity]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002D [System.String 
name]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002E 
[IronPython.Runtime.Types.PythonType .class]>,
<System.Reflection.RtFieldInfo object at 0x000000000000002F 
[IronPython.Runtime.PythonDictionary .dict]>,
<System.Reflection.RtFieldInfo object at 0x0000000000000030 [System.Object[] 
.slots_and_weakref]>))

--
-- Lukáš


Shri Borde wrote:

Note that you will have to set __metaclass__ to ClrMetaclass, not ClrTypeMetaclass as in DevHawk's sample. I had changed the name of the type. The old name will cause a NameError, but maybe SL is hiding exceptions. Can you do "o.GetType().GetFields()" and display that on the page to inspect the object and also make sure that no exceptions were thrown?

*From:* [email protected] <mailto:[email protected]> [mailto:[email protected]] *On Behalf Of *Lukas Cenovsky
*Sent:* Tuesday, November 10, 2009 2:59 PM
*To:* Discussion of IronPython
*Subject:* Re: [IronPython] .NET attributes for methods

I have just found that the Silverlight binding does not work with this version of clrtype and/or IronPython 2.6RC2. I used DevHawk demo [1] and after I added reference to Microsoft.Dynamic in clrtypemetaclass.py it worked flawlessly. But when I switch to your version, no items show in the listbox.

By the way - I have seen a commit message you have added support for interfaces - nice! ;-)

--
-- Lukáš

[1] http://cid-0d9bc809858885a4.skydrive.live.com/self.aspx/DevHawk%20Content/IronPython%20Stuff/^_^_clrtype^_^_/SL%20databinding%20demo.zip <http://cid-0d9bc809858885a4.skydrive.live.com/self.aspx/DevHawk%20Content/IronPython%20Stuff/%5E_%5E_clrtype%5E_%5E_/SL%20databinding%20demo.zip>

------------------------------------------------------------------------

_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

_______________________________________________
Users mailing list
[email protected]
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com

Reply via email to