Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据类中的其他变量控制按钮的IsEnable属性?_C#_Wpf_Data Binding_Xaml_Binding - Fatal编程技术网

C# 如何根据类中的其他变量控制按钮的IsEnable属性?

C# 如何根据类中的其他变量控制按钮的IsEnable属性?,c#,wpf,data-binding,xaml,binding,C#,Wpf,Data Binding,Xaml,Binding,我基本上遇到了一个问题,我有一些按钮被激活,需要根据类中的一些其他变量/属性来控制属性 因此,在XAML中,我可能会: <Window x:Class="RoboticPainterGUI.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

我基本上遇到了一个问题,我有一些按钮被激活,需要根据类中的一些其他变量/属性来控制属性

因此,在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();
        }
    }
}

在代码背后,我可能有:

<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();
        }
    }
}
painterGUI
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
INTA,B;
bool按钮可启用DPROP
{
得到
{
返回((A+B)>=5);
}
}
公共主窗口()
{
初始化组件();
}
}
}
所以,我想要的行为如下:

当A和B之和等于或大于5时, 应启用该按钮。当它 小于5时,按钮应为 残疾人

已经编写了
按钮EnabledTop
,以帮助完成此过程。除了在代码中A和B发生更改的每个部分手动设置按钮状态外,如何实现这一点

绑定到转换器会很好,但是转换器不能访问a或B。
绑定到属性本身会很好,但我不知道如何做,也没有找到如何做的示例。

您应该让MainWindow实现INotifyPropertyChanged接口,并调用OnPropertyChanged,属性名称为“ButtonneEnabledPro”:

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>

我刚刚粘贴的代码将使您的按钮处于启用状态

如果您想自动化您的流程,没有简单的方法。但这很好


希望这对您有所帮助

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

因此:

  • 创建一个类(ViewModel)
  • 将此属性添加到类中
  • 在按钮的IsEnabled上添加视图的绑定
  • 将视图的DataContext设置为ViewModel的实例
  • 当条件更改时,实现
    INotifyPropertyChanged
    接口并引发
    PropertyChanged
    事件

没关系。规则是一样的。更好的是,将A和B声明为属性,并在它们的设置器中调用NotifyPropertyChanged(“ButtonneEnabledProp”),然后每次A或B更改时都会重新评估绑定。