【问题标题】:Binding of Button isEnabled Property to a Boolean Does Not Change When INotifyPropertyChanged Fires当 INotifyPropertyChanged 触发时,按钮 isEnabled 属性与布尔值的绑定不会改变
【发布时间】:2018-10-29 23:05:07
【问题描述】:

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

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函数)它应该根据被调用的函数来改变禁用/启用。

【问题讨论】:

  • 看看输出窗口。你有关于绑定表达式的错误吗?
  • @dktaylor 不,它似乎没有错误。

标签: c# xaml uwp inotifypropertychanged


【解决方案1】:

在您的ChangeState 方法中,您正在创建一个新的BackState 对象,而这应该是您设置为DataContextBackObject 上的一个属性。实例化作为BackObject 上的属性的BackState,并绑定到该对象的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 (Model View ViewModel) 框架。

【讨论】:

  • 确认一下,你想让我创建一个返回新创建的 BackState 对象的属性?那么,你想让我绑定到 ThatSameProperty.IsEnabled 吗?我试过这个,它仍然无法改变启用。请原谅我,因为我是 C# 新手。
  • 该属性应该返回一个现有的对象,您可以在 BackObject 的构造函数中实例化该对象。重要的是您在 xaml 中绑定到属性正在更改的对象的同一实例
  • 也许可以将一些 BackObject 添加到您的答案中,以便我可以让您更好地了解如何实现它。您还应该尝试添加一些绑定到 BackObject 的标签,以便确保数据上下文设置正确
  • 我添加了它,以防我们对它是什么有不同的看法。
  • ChangeState 方法在哪里?你在使用 MVVM 吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 2019-12-25
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
相关资源
最近更新 更多