Подписка в компоненте:
Код: Выделить всё
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
}
}
Код: Выделить всё
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