Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.forms Exrin VisualState中嵌套对象的反应式扩展_Xamarin.forms_Exrin - Fatal编程技术网

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));
        }
    }