Флажок привязки к строке в IronPython - PullRequest
1 голос
/ 04 июля 2011

Как я могу привязать флажок к строке, чтобы при установке / снятии флажка значение строки изменялось? У меня есть это (с 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}"/>

Я хочу, чтобы, когда флажок снят, на ярлыке должен отображаться идентификатор последовательности, но когда он установлен, он должен просто отображать «Все». Для этого мне нужно изменить свойство идентификатора CurrentSeq на «Все». Как мне сделать это путем привязки данных? Есть ли другой способ сделать это?

РЕДАКТИРОВАТЬ: Я чувствую себя действительно глупо, но я просто не могу заставить это работать. Я пытался следовать предложению об использовании 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 голос
/ 05 июля 2011

Я бы использовал Конвертер .

Edit:

Вы можете реализовать конвертер в Python:

class BoolToVisibilityConverter(IValueConverter):

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

В прошлый раз, когда я работал с WPF в IronPython, вы не могли использовать его напрямую в .xaml. Я не уверен, улучшилось ли это в 2.7.

Другая возможность - добавить еще одно свойство, которое выполняет преобразование (converted_ID), в свой метод установки / получения. Думая об этом больше, я бы предпочел сделать это, потому что код находится в одном месте.

Редактировать 2:

Убедитесь, что вы используете notify_property вместо классического свойства Python.

...