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

2024-05-06

我刚刚开始在 WPF 中使用 IronPython,但我不太明白绑定应该如何完成。

通常在 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 ItemSsource:

self.data = ObservableCollection[Email]()
self.MyListBox.ItemsSource = self.data

归功于此链接的帮助:http://palepoli.skr.jp/wp/2009/06/28/wpf-listview-databinding-for-ironpython/ http://palepoli.skr.jp/wp/2009/06/28/wpf-listview-databinding-for-ironpython/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何绑定到 IronPython 中的列表框? 的相关文章

随机推荐