[Python.NET] How to handle INotifyPropertyChanged interface

Denis Akhiyarov denis.akhiyarov at gmail.com
Fri Apr 1 22:32:23 EDT 2016


All stackoverflow exceptions should be posted on stackoverflow!

On Thursday, March 31, 2016, Hansong Huang <hhspiny at live.com> wrote:

> 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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20160401/69cc7e2d/attachment.html>


More information about the PythonDotNet mailing list