It seems inheriting from INotifyPropertyChanged is the cause
self.window = 
System.Windows.Markup.XamlReader.Load(outStream)self.window.DataContext = 
MyViewModel()class MyViewModel(System.Object):    __namespace__ = "WPFPyDemo"   
 def __init__(self):        super(MyViewModel,self).__init__()        
self._inputText = "Line - in"    @clr.clrproperty(str)    def inputText(self):  
      return self._inputText    @inputText.setter    def inputText(self,value): 
       self._inputText = value        self.OnPropertyChanged("inputText")  
The above code works fine. 
but if switch inheritance to class 
MyViewModel(System.ComponentModel.INotifyPropertyChanged):and nothing else 
changed, python gives 
"The process terminates due to StackOverflowException"
Not sure why. 

Thanks for the help
From: hhsp...@live.com
To: pythondotnet@python.org
Subject: How to handle INotifyPropertyChanged interface
Date: Thu, 31 Mar 2016 20:38:38 -0400




I am still trying to figure out how to implement WPF MVVM with 
Python.Net.Previously, I have successfully used System.Dynamic.ExpandoObject as 
a ViewModel container 
self.window = 
System.Windows.Markup.XamlReader.Load(outStream)self.window.DataContext = 
DotNetExpandoObject()
where DotNetExpandoObject is a wrapper class for System.Dynamic.ExpandoObject 
class DotNetExpandoObject(System.Dynamic.ExpandoObject):...  in which I 
redefined __getattr__ and __setattr__ 
it works flawlessly as System.Dynamic.ExpandoObject implements 
INotifyPropertyChange interface already
Now, I would like to get away from using System.Dynamic.ExpandoObject but to 
implement my own
I first tried to expose a python class back to .Netclass 
MyViewModel(System.Object):    __namespace__ = "WPFPyDemo"    def 
__init__(self):        super(MyViewModel,self).__init__()        
self._inputText = "Line - in"    @clr.clrproperty(str)    def inputText(self):  
      return self._inputText    @inputText.setter    def inputText(self,value): 
       self._inputText = value        self.OnPropertyChanged("inputText")  
self.window.DataContext = MyViewModel()
The one direction data binding works fine, and the "Line - in" text correctly 
shows up in the textblock control.obviously this is not sufficient as there is 
no INotifyPropertyChange interface. 
So, I inherit the interface , and tries to implement the typical C# code" 
public event PropertyChangedEventHandler PropertyChanged"  
-- not sure how to handle event in Python.Net, the follow code probably is 
completely wrong
class ViewModel(System.ComponentModel.INotifyPropertyChanged):    __namespace__ 
= "WPFPy"    def __init__(self):        super(ViewModel, self).__init__()       
 self.PropertyChanged = System.ComponentModel.PropertyChangedEventHandler    
def OnPropertyChanged(self, propertyName):        if self.PropertyChanged != 
None:            PropertyChanged(self, 
System.ComponentModel.PropertyChangedEventArgs(propertyName))
class MyViewModel(ViewModel):    __namespace__ = "WPFPyDemo"    def 
__init__(self):        super(MyViewModel,self).__init__()        
self._inputText = "Line - in"
    @clr.clrproperty(str)    def inputText(self):        return self._inputText 
   @inputText.setter    def inputText(self,value):        self._inputText = 
value        self.OnPropertyChanged("inputText")  

The process terminates due to StackOverflowException. Looks like the error 
happens when WFP recoganized INotifyPropertyChange interface and tries to 
access MyViewModel class via it.                                                
                             
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
https://mail.python.org/mailman/listinfo/pythondotnet

Reply via email to