Xamarin.forms Exrin VisualState中嵌套对象的反应式扩展
我试图启用一个按钮,该按钮在输入绑定属性嵌套字段时被绑定,但即使所有属性都填充了数据,该按钮也被禁用。 我应该换什么 这是我的基本视觉状态Xamarin.forms Exrin VisualState中嵌套对象的反应式扩展,xamarin.forms,exrin,Xamarin.forms,Exrin,我试图启用一个按钮,该按钮在输入绑定属性嵌套字段时被绑定,但即使所有属性都填充了数据,该按钮也被禁用。 我应该换什么 这是我的基本视觉状态 public class BaseVisualState : Exrin.Framework.VisualState { public BaseVisualState() : this(null) { } public BaseVisualState(IBaseModel i_Model) : base(i_Model) { PropertyObserva
public class BaseVisualState : Exrin.Framework.VisualState
{
public BaseVisualState() : this(null)
{
}
public BaseVisualState(IBaseModel i_Model) : base(i_Model)
{
PropertyObservable = Observable.FromEventPattern(
(EventHandler<PropertyChangedEventArgs> i_Event) => new PropertyChangedEventHandler(i_Event),
i_EventChanged => this.PropertyChanged += i_EventChanged,
i_EventChanged => this.PropertyChanged -= i_EventChanged);
}
public IObservable<EventPattern<PropertyChangedEventArgs>> PropertyObservable { get; private set; }
}
这里的问题是,您是在Beacon类中触发INPC,但BaseVisualState只查看Beacon(对象本身)是否在更改 因此,您必须将属性带到Beacon之外,直接带到VisualState中,或者中继INPC事件 e、 g.在你的信标中做什么
var beacon = value;
Set(value);
value.OnPropertyChanged += (s,e) => { OnPropertyChanged(nameof(Beacon)); }
这意味着,每当Beacon中的任何属性发生更改时,它都会说Beacon类本身已更改,并触发VisualState的INPC
注意:重置事件时,请确保事件已在上释放。这意味着不必像我上面所展示的那样在anon func中执行该操作,而是执行+=并对其进行制表以创建另一个方法。这里的问题是您在Beacon类中触发INPC,但BaseVisualState只查看Beacon(对象本身)是否正在更改 因此,您必须将属性带到Beacon之外,直接带到VisualState中,或者中继INPC事件 e、 g.在你的信标中做什么
var beacon = value;
Set(value);
value.OnPropertyChanged += (s,e) => { OnPropertyChanged(nameof(Beacon)); }
这意味着,每当Beacon中的任何属性发生更改时,它都会说Beacon类本身已更改,并触发VisualState的INPC
注意:重置事件时,请确保事件已在上释放。这意味着不要像我上面所展示的那样在anon func中执行它,而是执行+=并将其标记为创建另一个方法。感谢Adam的帮助。
这就是我最后所做的,也许可以帮助别人
public class BeaconAddVisualState : BaseVisualState
{
private readonly IBeaconAddModel r_Model;
private Beacon m_Beacon;
public BeaconAddVisualState(IBeaconAddModel i_Model)
: base(i_Model)
{
r_Model = i_Model;
}
[Binding(BindingType.TwoWay)]
public Beacon Beacon
{
get
{
return m_Beacon;
}
set
{
if(m_Beacon != value)
{
if(m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
m_Beacon = value;
m_Beacon.PropertyChanged += m_Beacon_PropertyChanged;
OnPropertyChanged();
}
}
}
public override async void Init()
{
Beacon = new Beacon();
}
public override void Disposing()
{
if (m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
base.Disposing();
}
private void m_Beacon_PropertyChanged(
object i_Sender,
System.ComponentModel.PropertyChangedEventArgs i_EventArgs)
{
OnPropertyChanged(nameof(Beacon));
}
}
谢谢亚当的帮助。
这就是我最后所做的,也许可以帮助别人
public class BeaconAddVisualState : BaseVisualState
{
private readonly IBeaconAddModel r_Model;
private Beacon m_Beacon;
public BeaconAddVisualState(IBeaconAddModel i_Model)
: base(i_Model)
{
r_Model = i_Model;
}
[Binding(BindingType.TwoWay)]
public Beacon Beacon
{
get
{
return m_Beacon;
}
set
{
if(m_Beacon != value)
{
if(m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
m_Beacon = value;
m_Beacon.PropertyChanged += m_Beacon_PropertyChanged;
OnPropertyChanged();
}
}
}
public override async void Init()
{
Beacon = new Beacon();
}
public override void Disposing()
{
if (m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
base.Disposing();
}
private void m_Beacon_PropertyChanged(
object i_Sender,
System.ComponentModel.PropertyChangedEventArgs i_EventArgs)
{
OnPropertyChanged(nameof(Beacon));
}
}
重置时,您的意思是覆盖visualstate的disposing方法,对吗?我指的是您将放入Beacon属性集中的事件处理程序。确保你解开了那个事件。e、 g.value.OnPropertyChanged-=是的,您将在处理VisualState时执行此操作,并且每次设置该属性时都需要执行此操作。因此,首先检查它是否为null,如果不是,请删除现有的事件处理程序。当重置它时,您的意思是覆盖visualstate的disposing方法,对吗?我指的是您将放入Beacon属性集中的事件处理程序。确保你解开了那个事件。e、 g.value.OnPropertyChanged-=是的,您将在处理VisualState时执行此操作,并且每次设置该属性时都需要执行此操作。因此,首先检查它是否为null,如果不是,则删除现有的事件处理程序。
public class BeaconAddVisualState : BaseVisualState
{
private readonly IBeaconAddModel r_Model;
private Beacon m_Beacon;
public BeaconAddVisualState(IBeaconAddModel i_Model)
: base(i_Model)
{
r_Model = i_Model;
}
[Binding(BindingType.TwoWay)]
public Beacon Beacon
{
get
{
return m_Beacon;
}
set
{
if(m_Beacon != value)
{
if(m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
m_Beacon = value;
m_Beacon.PropertyChanged += m_Beacon_PropertyChanged;
OnPropertyChanged();
}
}
}
public override async void Init()
{
Beacon = new Beacon();
}
public override void Disposing()
{
if (m_Beacon != null)
{
m_Beacon.PropertyChanged -= m_Beacon_PropertyChanged;
}
base.Disposing();
}
private void m_Beacon_PropertyChanged(
object i_Sender,
System.ComponentModel.PropertyChangedEventArgs i_EventArgs)
{
OnPropertyChanged(nameof(Beacon));
}
}