开发者

Binding checkbox to string in IronPython

开发者 https://www.devze.com 2023-03-17 18:19 出处:网络
How can I bind a checkbox to a string such that when the checkbox is checked/unchecked, the value of the string changes? I have 开发者_如何学运维this (with CheckAll as my checkbox):

How can I bind a checkbox to a string such that when the checkbox is checked/unchecked, the value of the string changes? I have 开发者_如何学运维this (with CheckAll as my checkbox):

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 

and

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

I want that when the checkbox is unchecked, the label should display the sequence ID, but when it is checked, it should simply display “All”. For this I need to change the ID property of CurrentSeq to “All”. How do I do that by data binding? Is there any other way I can do this?

EDIT: I feel really stupid but I just can’t get this to work. I have been trying to follow the suggestion about using getter/setter but I guess I don’t know enough. Before doing anything more complicated, I simply want to make a button disabled when I tick the checkbox and enable it when I uncheck it. This is what I wrote:

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)

And:

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

Unfortunately there is no error but no effect either. The code does not do anything. Would really appreciate if you could help me out with this.

EDIT2: Using the notify_property, I tried this:

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

Still the same result: no effect. I just cannot understand where the problem is.


I would use Converter.

Edit:

You can implement converter in Python:

class BoolToVisibilityConverter(IValueConverter):

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

Last time I worked with WPF in IronPython, you could not use it directly in .xaml. I am not sure whether it has improved in 2.7.

Another possibility is to add another property which does the conversion (converted_ID) in its setter/getter. Thinking more about it, I would do rather this, because the code is in one place.

Edit 2:

Make sure, you are using notify_property instead of classic Python property.

0

精彩评论

暂无评论...
验证码 换一张
取 消