在IronPython中将复选框绑定到字符串

1 投票
1 回答
1117 浏览
提问于 2025-04-16 20:49

我想把一个复选框和一个字符串绑定在一起,这样当复选框被选中或取消选中时,字符串的值会改变。我现在有这个(复选框叫 CheckAll):

class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'BioApp1.xaml')
        openDialog = SequenceFileOperations()
        self.Sequences = openDialog.Open()
        object = MyObjects(self.Sequences)
        self.CheckAll.DataContext = object
        self.IDLabel.DataContext = object


class MyObjects(object):
    def __init__(self, Sequences):
        self.CurrentSeq = Sequences[0]
        self.ID = self.CurrentSeq.ID 

还有

<Label Height="28" HorizontalAlignment="Left" Margin="152,221,0,0" VerticalAlignment="Top" Width="98" Name="IDLabel" Content="{Binding Path=ID}"/>

我希望当复选框没有被选中时,标签显示序列 ID,但当它被选中时,标签只显示“全部”。为此,我需要把 CurrentSeq 的 ID 属性改成“全部”。我该怎么通过数据绑定来实现这个?还有没有其他方法可以做到这一点?

编辑:我觉得自己很笨,但就是搞不定这个。我一直在尝试使用 getter/setter 的建议,但我想我还不够了解。在做更复杂的事情之前,我只是想在勾选复选框时禁用一个按钮,而在取消勾选时启用它。这是我写的:

class MyWindow(Window):
    def __init__(self):
    wpf.LoadComponent(self, 'App1.xaml')
    object = BindingClass(self.Check, self.PreviousBtn)
    self.PreviousBtn.DataContext = object 

class BindingClass(object):
    def __init__(self, Check, PreviousBtn):
        self.Check = Check
        self.PreviousBtn = PreviousBtn

    def GetEnabledConverter(self):
        if self.CheckAll.IsChecked:
            return self.PreviousBtn.IsEnabled

    def SetEnabledConverter(self):
        if self.CheckAll.IsChecked:
            self.PreviousBtn.IsEnabled = False
        else:
            self.PreviousBtn.IsEnabled = True

    EnabledConverter = property(GetEnabledConverter, SetEnabledConverter)

还有:

<Button Content="Previous" IsEnabled="{Binding Path=EnabledConverter}" />

可惜没有错误,但也没有任何效果。代码没有任何作用。如果你能帮我解决这个问题,我会非常感激。

编辑2:使用 notify_property,我试了这个:

class MyWindow(Window):
    def __init__(self):
        wpf.LoadComponent(self, 'Test.xaml')
        c = Converters(self.check1, self.Button)
        self.Button.DataContext = c

class Converters(NotifyPropertyChangedBase):
    def __init__(self, check, button):
        super(Converters, self).__init__()
        self.Check = check
        self.Button = button


    @notify_property
    def ButtonEnabled(self):
        return self.Button.IsEnabled

    @ButtonEnabled.setter
    def ButtonEnabled(self):
        if self.Check.IsChecked:
            self.Button.IsEnabled = False
        else:
            self.Button.IsEnabled = True

结果还是一样:没有效果。我就是搞不懂问题出在哪里。

1 个回答

1

我会使用转换器

补充:

你可以在Python中实现一个转换器:

class BoolToVisibilityConverter(IValueConverter):

    def Convert(self, value, targetType, parameter, culture):
        return Visibility.Visible if value != val else Visibility.Collapsed

我上次在IronPython中使用WPF时,不能直接在.xaml中使用它。我不确定在2.7版本中是否有改进。

另一种方法是添加一个新的属性,用于转换(converted_ID),在它的设置器和获取器中进行处理。仔细想想,我更倾向于这样做,因为这样代码都在一个地方。

补充 2:

确保你使用的是notify_property,而不是传统的Python属性。

撰写回答