Способы управления свойством IsEnable кнопки в соответствии с некоторыми другими переменными в классе? - PullRequest
0 голосов
/ 08 декабря 2010

У меня, по сути, есть проблема, когда у меня есть кнопка, которой нужно управлять портиком IsEnabled, основываясь на некоторых других переменных / свойствах в классе.

Так что в XAML у меня может быть:

<Window x:Class="RoboticPainterGUI.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RoboticPainterGUI"
        Loaded="Window_Loaded" Name="Window_Main"
        Title="MainWindow" Height="555" Width="630">
    <Grid>
        <Button Name="Button_Next" Content="Lorem Ipsum" />
    </Grid>
</Window>

И в коде для этого у меня может быть:

namespace RoboticPainterGUI
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int A, B;

        bool ButtonEnabledProp
        {
            get
            {
                return ((A + B) >= 5);
            }
        }

        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

Итак, что я хочу, чтобы поведение было следующим:

Когда сумма Aи B 5 или более, кнопка должна быть включена.Когда значение меньше 5, кнопка должна быть отключена.

ButtonEnabledProp уже написано, чтобы помочь в этом процессе.Как это может быть реализовано, кроме ручной установки состояния кнопки в каждой части кода, где изменяются A и B?

Было бы неплохо связать с преобразователем, но преобразователь не имел бы доступа к A илиБ. Было бы неплохо связываться с самой собственностью, но я не знаю, как это сделать, и не нашел примера, как это сделать.

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

Вы должны заставить MainWindow реализовывать интерфейс INotifyPropertyChanged и вызывать OnPropertyChanged, указав «ButtonEnabledProp» в качестве имени свойства:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    int A, B;

    bool ButtonEnabledProp
    {
        get
        {
            return ((A + B) >= 5);
        }
    }

    public MainWindow()
    {
        InitializeComponent();

        A = B = 3;

        NotifyPropertyChanged("ButtonEnabledProp");
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

Затем вы можете изменить свой файл xaml, добавив к нему привязку данных и получить что-то вроде:

<Window x:Class="RoboticPainterGUI.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:RoboticPainterGUI"
        Loaded="Window_Loaded" Name="Window_Main"
        Title="MainWindow" Height="555" Width="630">
    <Grid>
        <Button Name="Button_Next" Content="Lorem Ipsum" IsEnabled="{Binding Path=ButtonEnabledProp}"  />
    </Grid>
</Window>

Код, который я только что вставил, сделает вашу кнопку включенной.

Если вы хотите автоматизировать свой процесс, простого способа нет.Но PostSharp делает это очень хорошо.

Надеюсь, это поможет

0 голосов
/ 08 декабря 2010

Если вам нужно использовать привязку, лучше поместить это свойство в другой класс, а не в само представление.

Итак:

  • Создать класс (ViewModel)
  • Добавить это свойство в класс
  • Добавить привязку для вида на IsEnabled кнопки
  • Установить DataContext для View для экземпляра ViewModel
  • Реализовать интерфейс INotifyPropertyChanged и вызвать событие PropertyChanged, когда условие изменилось .
...