如何根据类中的一些其他变量来控制按钮的IsEnabled属性?

时间:2010-12-07 23:02:46

标签: c# wpf data-binding xaml binding

我基本上遇到一个问题,我有一些按钮需要根据类中的其他变量/属性来控制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或B. 绑定到属性本身会很好,但我不知道如何做到这一点,并没有找到一个示例如何。

2 个答案:

答案 0 :(得分:1)

您应该让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做得很好。

希望这有帮助

答案 1 :(得分:0)

如果需要使用绑定,最好将此属性放在另一个类而不是视图本身上。

所以:

  • 创建一个类(ViewModel)
  • 将此属性添加到类
  • 在按钮
  • 的IsEnabled上添加View的绑定
  • 将View的DataContext设置为ViewModel的实例
  • 在条件更改
  • 时实施INotifyPropertyChanged界面并举起PropertyChanged事件。