Dependency Properties and Commands are very useful WPF features.
In my last post I wrote about how to use Dependency Properties in IronPython. In this post we will see how to implement and use the WPF RelayCommand (for more details see WPF Apps With The Model-View-ViewModel Design Pattern).
import clr
clr.AddReference("WindowsBase")
clr.AddReference("PresentationCore")
clr.AddReference("PresentationFramework")
from System import (
EventArgs
)
from System.Windows import (
DependencyObject
)
from System.Windows.Input import (
ICommand
)
class RelayCommand(ICommand):
def __init__(self, executeFunction, canExecuteFunction):
self._executeFunction = executeFunction
self._canExecuteFunction = canExecuteFunction
self._handlers = []
def CanExecute(self, parameter):
return self._canExecuteFunction(parameter)
def add_CanExecuteChanged(self, handler):
self._handlers.append(handler)
def remove_CanExecuteChanged(self, handler):
self._handlers.remove(handler)
def canExecuteChanged(self):
for handler in self._handlers:
handler(self, EventArgs.Empty)
def Execute(self, parameter):
self._executeFunction(parameter)
self.canExecuteChanged()
class Planning(DependencyObject):
_sessionProperty = None
def __new__(cls):
if not Planning._sessionProperty:
Planning._sessionProperty = DependencyProperty.Register(
"session", clr.GetClrType(Session), clr.GetClrType(Planning))
return DependencyObject.__new__(cls)
def __init__(self):
self.loginCommand = RelayCommand(lambda p : self.login(p), lambda p : not self.session)
def login(self, user):
self.session = Session(user)
def getSession(self):
return self.GetValue(Planning._sessionProperty)
def setSession(self, value):
self.SetValue(Planning._sessionProperty, value)
session = property(getSession, setSession)
0 comments:
Post a Comment