RxUI - WPF - Стиль привязки DataTrigger без DataContext - PullRequest
0 голосов
/ 27 ноября 2018

Предупреждение:
Совершенно новый для ReactiveUI.Попытка полностью использовать RxUI с целью никогда не устанавливать DataContext представления.Я считаю, что это можно сделать!

Сценарий:
У меня есть кнопка, и у кнопки есть стиль, и стиль этой кнопки имеет MultiDataTrigger с первым условием IsMouseOver и вторым условиемсвойство на моей ViewModel типа bool.Это затем меняет фон или передний план кнопки.Традиционно, вы просто привязали бы это второе условие к свойству ViewModel.

Есть ли реальный способ для этого взаимодействия работать без использования DataContext, но при этом иметь ожидаемый результат?Я не могу напрямую получить доступ к условной привязке, поскольку у нее нет имени.Так что должна быть какая-то странная настройка, чтобы заставить это работать.

Решение на самом деле не фанат:
Я мог бы потенциально добавить элемент управления, который не отображается, дать емуимя и используйте this.OneWayBind (), чтобы связать это свойство со свойством IsEnabled этого элемента управления.При этом мое второе условие MultiDataTrigger кнопки могло тогда использовать привязку, основанную на ElementName и его пути IsEnabled.Это позволило бы мне НЕ использовать DataContext, но, на мой вкус, кажется слишком «хакерским».Должен быть другой путь!

Заранее спасибо!

Редактировать 1 - Попытка 1 на основе комментария Гленна Уотсона к сообщению

        this.WhenActivated(disposables =>
        {
            this.WhenAnyValue(x => x.TheButton.IsMouseOver, x => x.ViewModel.SomeBoolValue).Subscribe(x =>
            {
                if (!x.Item1)
                    TheButton.Background = x.Item2 ? Brushes.Gray : Brushes.Blue;
                else
                    TheButton.Background = x.Item2 ? Brushes.Red : Brushes.Green;
            }).DisposeWith(disposables);
        });

Редактировать 2 - реализовано / с использованием ответа Гленна Уотсона.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я бы порекомендовал что-то, близкое к имеющемуся у вас решению:

this.WhenAnyValue(x => x.TheButton.IsMouseOver, x => x.ViewModel.SomeBoolValue,
      (isMouseOver, boolValue) => 
      {
         if (isMouseOver)
           return boolValue ? Brushes.Gray : Brushes.Blue;
         else 
           return boolValue ? Brushes.Red : Brushes.Green;
      })
      .BindTo(this, view => view.TheButton.Background)
      .DisposeWith(disposables);

В модификациях используется третий параметр, который принимает параметризованную лямбду к двум предыдущим значениям, а затем просто использует BindTo ().Это не должно отличаться от того, что у тебя есть.

0 голосов
/ 27 ноября 2018

У меня есть пара идей.У вас нет времени сначала попробовать их, но они могут помочь.

  1. Вы можете попробовать встроить триггер в ресурсы кнопки напрямую, а затем по-прежнему использовать имя кнопки для одностороннего связывания.

  2. Вы можете попытаться определить новый шаблон данных для кнопки и нацелить вашу модель представления, которая имеет свойства триггера.

...