Я работаю над приложением 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()
Похоже, я делаю что-то не так с привязкой к реактивному.
Буду признателен, если кто-нибудь сможет помочь.
Спасибо.