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: hhspiny@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 .Net
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")  

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.