ReactiveUI: двусторонняя привязка WPF не работает должным образом - PullRequest
0 голосов
/ 25 февраля 2020

Я работаю над приложением WPF, использующим реактивную, и испытываю трудности с получением двухсторонней привязки, работающей в моем пользовательском свойстве зависимости. Я могу заставить это работать, используя привязку WPF, но не используя реактивный интерфейс.

У меня есть пользовательский элемент управления под названием IPAddressControl, который принимает ввод IP-адреса и предоставляет свойство зависимости ValidIpAddress, показанное ниже.

    public static readonly DependencyProperty ValidIpAddressProperty =
        DependencyProperty.Register(
            "ValidIpAddress",
            typeof(bool),
            typeof(IPAddressControl),
            new FrameworkPropertyMetadata(
                false,
                FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                new PropertyChangedCallback(OnValidIpAddressPropertyChanged)));

    public bool ValidIpAddress
    {
        get
        {
            return (bool)GetValue(ValidIpAddressProperty);
        }
        set
        {
            SetValue(ValidIpAddressProperty, value);
        }
    }

    private static void OnValidIpAddressPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        IPAddressControl IPAddressControl = d as IPAddressControl;
        IPAddressControl.ValidIpAddress = (bool)e.NewValue;
    }

На мой взгляд, я установил привязку следующим образом:

public partial class MyView : ReactiveUserControl<MyViewModel>

    public MyView()
    {
        InitializeComponent();

        ViewModel = new MyViewModel();

        this.WhenActivated(view =>
        {
           this.Bind(ViewModel, vm => vm.ValidIpAddress,     v => v.ipaddress.ValidIpAddress);
        });
    }

И определил свойство модели представления

public class MyViewModel : ReactiveObject
{
    bool _validIpAddress = false;
    public bool ValidIpAddress
    {
        get => this._validIpAddress;
        set => this.RaiseAndSetIfChanged(ref _validIpAddress, value);
    }
}

Когда свойство обновляется в IPAddressControl

IPAddressControl.ValidIPaddress = true;

Я ожидаю, что MyViewModel.ValidIpAddress.Set будет вызван, однако этого не происходит.

Когда я возвращаюсь к стандартной реализации WPF, двусторонняя привязка работает хорошо, т.е. я устанавливаю привязку в myview.xaml

ValidIpAddress="{Binding Path=ValidIpAddress}"

, затем устанавливаю контекст данных в конструкторе MyView ( );

this.DataContext = new MyViewModel()

Похоже, я делаю что-то не так с привязкой к реактивному.

Буду признателен, если кто-нибудь сможет помочь.

Спасибо.

...