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

时间:2018-05-19 20:52:40

标签: c# xaml uwp inotifypropertychanged

我一直试图将Button的isEnabled属性成功绑定到布尔变量。更新布尔值后,Button的启用状态不会更改。我使用Microsoft的有用文档来构建我的代码,找到here。在搜索StackOverflow时,我遇到了关于类似问题的this文章。它没有帮助我修复这个bug。

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函数)都应根据被调用函数更改禁用/启用。

1 个答案:

答案 0 :(得分:2)

在您的ChangeState方法中,您正在创建一个新的BackState对象,而这应该是您设置为BackObject的{​​{1}}上的属性。实例化DataContext作为BackState上的属性,并绑定到该对象的BackObject属性,以便告知xaml侦听该属性的更改。

isEnabled

然后在方法中:

<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>

但是,如果您最终对xaml未绑定的对象的实例进行更改,则此方法无效。您似乎在xaml中创建了public static void ChangeState(bool b) { if(b == true) { yourPropertyWhcihIsBackState.isEnabled = true; Debug.WriteLine("Enabled Property"); }else{ yourPropertyWhcihIsBackState.isEnabled = false; Debug.WriteLine("Disabled Property"); } } 的新实例,但看起来您没有任何方法可以在代码中访问此对象。考虑设置BackObject来完成此操作。看看mvvm light,这是一个很棒的mvvm(模型视图ViewModel)框架。