Подписка ReactiveUI WhenAnyValue не срабатывает при изменении свойства на новое значение в BlazorC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Подписка ReactiveUI WhenAnyValue не срабатывает при изменении свойства на новое значение в Blazor

Сообщение Anonymous »

Я разрабатываю приложение Blazor, используя ReactiveUI и библиотеку Mudblazor. У меня есть ColorPickerViewModel со свойством SelectedColor. В одном из моих компонентов я подписываюсь на изменения этого свойства, чтобы обновлять цвет карты, когда пользователь выбирает новый цвет.
Подписка в компоненте:

Код: Выделить всё

ViewModel.ColorPickerViewModel.WhenAnyValue(p => p.SelectedColor)
.Skip(1)
.SelectMany(async p =>
{
var result = await ViewModel.CanvasViewModel.OnCardColorChanged(p);
Snackbar.IfFail(result);

await InvokeAsync(StateHasChanged);

return Unit.Default;
})
.Subscribe()
.DisposeWith(_disposables);
ColorPickerViewModel:

public class ColorPickerViewModel : ReactiveObject, IColorPickerViewModel
{
private string _color = ColorPalette.DomainEventColor;

public string SelectedColor
{
get => _color;
set => this.RaiseAndSetIfChanged(ref _color, value);
}

public void ApplyCardConfig(ReactiveBoardObjectBase card)
{
_color = card.Type;  // Assigning directly to avoid triggering subscription
}
}
Соответствующая часть компонента ColorPicker:

Код: Выделить всё

public partial class ColorPicker : ReactiveInjectableComponentBase
{
private MudColor _value = ColorPalette.DomainEventColor;

[Inject] public required IToolBarViewModel ToolBarViewModel { get; set; }

[Parameter] public required IEnumerable CustomPalette { get; set; }

public MudColor SelectedValue
{
get => _value;
set
{
_value = value;
ViewModel!.SelectedColor = value.Value;
}
}

protected override void OnInitialized()
{
_value = ViewModel!.SelectedColor;
StateHasChanged();
}
}
Проблема:
Подписка на изменения SelectedColor работает большую часть времени, но не срабатывает, когда я выбираю вторую карту и меняю ее цвет такой же, как и на первой карте, измененный. Вот что происходит:
Я меняю цвет первой карты на желтый.
Я выбираю другую карту, имеющую любой цвет, кроме желтого.
Я пытаюсь изменить цвет этой карты становится желтым, но подписка не срабатывает. В компоненте ColorPicker я вижу, что он изначально отображает правильный цвет карты.
Что я пробовал:
Замена _color = card.Type; с SelectedColor = card.Type; в ApplyCardConfig решает проблему, но это запускает подписку при выборе карты, чего я не хочу.
Удаление .Skip(1) из подписки, но проблема остается.
Добавление .DistinctUntilChanged() , но это не помогло.
Вопрос:
Почему подписка не срабатывает, когда я меняю SelectedColor на другое значение после прямой установки _color? Как я могу предотвратить активацию подписки при выборе карты, но при этом обеспечить ее правильную работу, когда пользователь меняет цвет?
Будем очень благодарны за любую помощь или объяснение!

Подробнее здесь: https://stackoverflow.com/questions/793 ... rty-to-a-n
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»