在IronPython中将复选框绑定到字符串
我想把一个复选框和一个字符串绑定在一起,这样当复选框被选中或取消选中时,字符串的值会改变。我现在有这个(复选框叫 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属性。