如何绑定到IronPython中的列表框?

| 我刚开始将IronPython与WPF一起使用,但我并没有安静地了解应该如何进行绑定。 通常在WPF中,我会做这样的事情:
<ListBox Name=\"MyListBox\">
    <ListBox.Resources>
        <Style TargetType=\"ListBoxItem\">
            <Setter Property=\"ContentTemplate\">
                <Setter.Value>
                    <DataTemplate>
                        <DockPanel>
                            <TextBlock Text=\"{Binding Path=From}\" />
                            <TextBlock Text=\"{Binding Path=Subject}\" />
                        </DockPanel>
                     </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
</ListBox>
然后在我的代码后面:
MyListBox.ItemsSource = new ObservableCollection<Email>()
但是在IronPython中,我们不能有对象的ObservableCollection,而只能是类型。这不起作用:
MyListBox.ItemsSource = new ObservableCollection[email]()
抛出异常:\“ expected Array [Type],got classobj \” 我应该做些什么?请帮助!     
已邀请:
        我自己解决了这个问题,我有一些错误,也缺少一些关键点。我希望这个答案可以帮助其他人。 首先是您需要IronPython目录中tutorial /目录中的pyevent.py。 其次,我们需要一个辅助类:
class NotifyPropertyChangedBase(INotifyPropertyChanged):
    \"\"\"INotifyProperty Helper\"\"\"
    PropertyChanged = None
    def __init__(self):
        (self.PropertyChanged, self._propertyChangedCaller) = make_event()

    def add_PropertyChanged(self, value):
        self.PropertyChanged += value

    def remove_PropertyChanged(self, value):
        self.PropertyChanged -= value

    def OnPropertyChanged(self, propertyName):
        self._propertyChangedCaller(self, PropertyChangedEventArgs(propertyName))
然后,您需要像这样声明数据类:
class Email(NotifyPropertyChangedBase):
    \"\"\"
        use setter getter.
        IronPython 2.6 or later.
    \"\"\"
    @property
    def From(self):
        return self._From

    @From.setter
    def From(self, value):
        self._From = value
        self.OnPropertyChanged(\"From\")

    @property
    def Subject(self):
        return self._Subject

    @Subject.setter
    def Subject(self, value):
        self._Subject = value
        self.OnPropertyChanged(\"Subject\")
最后设置ListBox的ItemSource:
self.data = ObservableCollection[Email]()
self.MyListBox.ItemsSource = self.data
感谢此链接以获取帮助:http://palepoli.skr.jp/wp/2009/06/28/wpf-listview-databinding-for-ironpython/     
        扩展boden的答案,您可能需要对NotifyPropertyChangedBase进行一些增强:
class NotifyPropertyChangedBase(INotifyPropertyChanged):
    PropertyChanged = None
    def __init__(self):
        self.PropertyChanged, self._propertyChangedCaller = pyevent.make_event()

    def add_PropertyChanged(self, value):
        self.PropertyChanged += value

    def remove_PropertyChanged(self, value):
        self.PropertyChanged -= value

    def OnPropertyChanged(self, propertyName):
        if self.PropertyChanged is not None:
            self._propertyChangedCaller(self, PropertyChangedEventArgs(propertyName))

    def init_view(self, view):
        xaml = view
        self.view = XamlLoader(xaml).Root
        self.view.DataContext = self

    def declareNotifiable(self, *symbols):
        for symbol in symbols:
            self.defineNotifiableProperty(symbol)

    def defineNotifiableProperty(self, symbol):
        dnp = \"\"\"
import sys
sys.path.append(__file__)
from NotifyProperty import *
@notify_property
def {0}(self):
    return self._{0}   

@{0}.setter
def {0}(self, value):
    self._{0} = value
\"\"\".format(symbol)
        d = globals()
        exec dnp.strip() in d
        setattr(self.__class__, symbol, d[symbol])
        exec(\"self.{0} = \'\'\".format(symbol))
设置好之后,您可以执行以下操作:
class Email(NotifyPropertyChangedBase):
    def __init__(self):
        self.defineNotifiableProperty(\"From\", \"Subject\")
设置好之后,您将为defineNotifiableProperty调用中的所有内容设置@notify_property和@ property.setter项。     
        IronPython区分大小写,并且不使用
new
关键字。尝试:
MyListBox.ItemsSource = ObservableCollection[Email]()
    

要回复问题请先登录注册