Re: [Python.NET] How to handle INotifyPropertyChanged interface

Hansong Huang <[email protected]>
Newsgroups gmane.comp.python.dotnet
Message-ID <[email protected]>
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: [email protected]
To: [email protected]
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 - [email protected]
https://mail.python.org/mailman/listinfo/pythondotnet
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.