Привязка свойства isEnabled кнопки к логическому значению не изменяется при срабатывании INotifyPropertyChanged - PullRequest
0 голосов
/ 19 мая 2018

Я пытался успешно связать свойство isEnabled Button с логической переменной.После обновления логического значения состояние кнопки не изменяется.Я использовал полезную документацию 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"/>

В графическом интерфейсе кнопка постоянно остается активной.(Независимо от того, вызвана ли функция ChangeState). Она должна изменить / отключить в соответствии с вызываемой функцией.

1 Ответ

0 голосов
/ 20 мая 2018

В вашем методе 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.Кажется, вы создаете новый экземпляр BackObject в своем xaml, но, похоже, у вас нет никакого способа получить доступ к этому объекту в вашем коде.Рассмотрите возможность установки ViewModel для достижения этой цели.Взгляните на mvvm light , это отличный фреймворк mvvm (Model View ViewModel).

...