繁体   English   中英

INotifyPropertyChanged触发时,按钮isEnabled属性与布尔值的绑定不会更改

[英]Binding of Button isEnabled Property to a Boolean Does Not Change When INotifyPropertyChanged Fires

我一直试图将Button的isEnabled属性成功绑定到布尔变量。 更新布尔值后,按钮的启用状态不会更改。 我使用了Microsoft提供的有关此主题的有用文档来构成我的代码,请参见此处 在搜索StackOverflow时,我遇到了有关类似问题的这篇文章。 它没有帮助我修复此错误。

public class BackState : INotifyPropertyChanged
{
    public bool _isEnabled;
    public bool isEnabled
    {
        get
        {
            return _isEnabled;
        }

        set
        {
            if (value != _isEnabled)
            {
                _isEnabled = value;
                NotifyPropertyChanged("isEnabled");
                Debug.WriteLine("NotifyPropertyChanged was called successfully");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string info)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
    }

}

XAML代码段:

<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
    <Button x:FieldModifier="public" IsEnabled="{Binding isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="&#xE76B;" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>

我的布尔值更改函数

public static void ChangeState(bool b)
{
    BackState bs = new BackState();
    if(b == true)
    {
        bs.isEnabled = true;
            Debug.WriteLine("Enabled Property");
    }else{
        bs.isEnabled = false;
            Debug.WriteLine("Disabled Property");
    }
}

这是BackObject的定义

<local:BackState x:Key="BackObject"/>

在GUI中,该按钮始终保持启用状态。 (无论是否调用ChangeState函数)都应根据调用的函数来更改禁用/启用状态。

在你ChangeState的方法是创建一个新的BackState对象,而这应该是在一个属性BackObject您正在设置的DataContext 实例化一个BackState是在一个属性BackObject ,并绑定到isEnabled使得XAML被告知要侦听更改该属性,对象的属性。

<Grid DataContext="{Binding BackObject}" HorizontalAlignment="Stretch" Height="250" VerticalAlignment="Top">
    <Button x:FieldModifier="public" IsEnabled="{Binding yourPropertyWhcihIsBackState.isEnabled, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Click="Back_Click" x:Name="Back" Foreground="DarkGray" Content="&#xE76B;" FontFamily="Segoe MDL2 Assets" Background="#33FFFFFF" FontSize="20" Margin="40,70,0,133" />
</Grid>

然后在方法中:

public static void ChangeState(bool b)
{
    if(b == true)
    {
        yourPropertyWhcihIsBackState.isEnabled = true;
            Debug.WriteLine("Enabled Property");
    }else{
        yourPropertyWhcihIsBackState.isEnabled = false;
        Debug.WriteLine("Disabled Property");
    }
}

但是,如果最终要对未绑定xaml的对象的实例进行更改,则此方法将无效。 您似乎在xaml中创建了BackObject的新实例,但是您似乎无法以任何方式在代码中访问此对象。 考虑设置一个ViewModel来完成此任务。 看一下mvvm light ,它是一个很棒的mvvm(模型视图ViewModel)框架。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM