XAML DataTrigger не обновляется - PullRequest
1 голос
/ 26 апреля 2020

Я пытаюсь изменить цвет кнопки при изменении свойства в источнике данных. Инициализация цвета фона работает правильно на основе начального значения свойства IsFilterOn, но не обновляется при изменении свойства.

XAML

<FlexLayout BindableLayout.ItemsSource="{Binding Filters}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <Button>
                <Button.Triggers>
                    <DataTrigger Binding="{Binding IsFilterOn}" TargetType="Button" Value="False">
                        <Setter Property="BackgroundColor" Value="{Binding UpColour}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsFilterOn}" TargetType="Button" Value="True">
                        <Setter Property="BackgroundColor" Value="{Binding DownColour}" />
                    </DataTrigger>
                </Button.Triggers>
            </Button>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</FlexLayout>

Filters является ObservableCollection<FilterModel>:

public class FilterModel
{
    public string UpColour { get; set; }
    public string DownColour { get; set; }
    public bool IsFilterOn { get; set; }
}

Правильное нажатие кнопки обновляет свойство IsFilterOn для кнопки (код не показан), но пользовательский интерфейс не изменяется, чтобы отразить его. Что я делаю не так?

1 Ответ

1 голос
/ 26 апреля 2020

Мы не можем видеть, как вы обновляете свойство IsFilterOn с true до false, но если вы напрямую изменяете свойство одного из экземпляров FilterModel в списке, событие изменения свойства не будет быть вызванным.

ObservableCollection будет выполнять события измененных свойств, когда вы добавляете или удаляете что-то из списка, но не наблюдаете свойства объектов.

У вас есть 2 варианта, либо вызовите Свойства Измененные события из вашего FilterModel в любое время IsFilterOn обновляются или изменяют все значения свойств, которые вам нужны, а затем вручную выполняют изменение свойства в списке. Если вы обновляете несколько FilterModel с одновременно, производительность, вероятно, будет выше со вторым вариантом.

Опция 1:

public class FilterModel : INotifyPropertyChanged {
    public string UpColour { get; set; }
    public string DownColour { get; set; }

    private bool _isFilterOn = false;
    public bool IsFilterOn {
        get { return _isFilterOn; }
        set {
            _isFilterOn = value;
            NotifyPropertyChanged(); // Anytime this property is changed Property Changed will be executed
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

Опция 2:

public class FilterViewModel {
    private ObservableCollection<FilterModel> _filters;
    public ObservableCollection<FilterModel> Filters {
        get => _filters ?? (_filters = new ObservableCollection<FilterModel>());
        set {
            _filters = value;
            NotifyPropertyChanged();
        }
    }

    public void ToggleFilters() {
        // some logic

        Filters[0].IsFilterOn = true; // Make all property changes

        NotifyPropertyChanged(nameof(Filters)); // Tell the UI that the list has been updated and to refresh the data
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([System.Runtime.CompilerServices.CallerMemberName] string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...