首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Behavior<>中Xamarin结合不起作用

Behavior<>中Xamarin结合不起作用
EN

Stack Overflow用户
提问于 2021-07-24 17:16:18
回答 1查看 89关注 0票数 0

我做出了将图像传输到ViewModel属性的行为。当用户с舔到元素时,库将打开。当用户从图片库中选择某个图像时,我的ImageBytes将有该图像的字节。但是,在我为该属性分配了一个新值之后,它不会传递给我的VM。

我的视图模型不响应行为中的更改。

代码语言:javascript
复制
    public class FolderDialogBehavior : Behavior<View>
    {
        public byte[] ImageBytes
        {
            get { return (byte[])GetValue(ImageBytesProperty); }
            private set 
            { 
                SetValue(ImageBytesProperty, value);
            }
        }

        public readonly static BindableProperty ImageBytesProperty = BindableProperty.Create(nameof(ImageBytes), typeof(byte[]),
            typeof(FolderDialogBehavior), null, BindingMode.TwoWay);


        private TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer()
        {
            NumberOfTapsRequired = 1
        };

        protected override void OnAttachedTo(View view)
        {
            base.OnAttachedTo(view);

            tapGestureRecognizer.Tapped += OnTapGestureRecognizerTapped;
            view.GestureRecognizers.Add(tapGestureRecognizer);
        }

        protected override void OnDetachingFrom(View view)
        {
            base.OnDetachingFrom(view);

            tapGestureRecognizer.Tapped -= OnTapGestureRecognizerTapped;
            view.GestureRecognizers.Remove(tapGestureRecognizer);
        }

        private void OnTapGestureRecognizerTapped(object sender, EventArgs e)
        {
            GetPhotoAsync();
        }

        private async void GetPhotoAsync()
        {
            try
            {
                var photo = await MediaPicker.PickPhotoAsync();

                byte[] bytes;

                using (Stream sourceStream = await photo.OpenReadAsync())
                {
                    bytes = new byte[sourceStream.Length];
                    await sourceStream.ReadAsync(bytes, 0, (int)sourceStream.Length);
                }

                ImageBytes = bytes;
            }
            catch (Exception ex)
            {
                //await DisplayAlert("Сообщение об ошибке", ex.Message, "OK");
            }
        }
    }
代码语言:javascript
复制
     <Frame>
         <Frame.Behaviors>
             <local:FolderDialogBehavior ImageBytes="{Binding AddEmployee.UserImage, Mode=TwoWay}"/>
         </Frame.Behaviors>
     </Frame>
代码语言:javascript
复制
     public class EmployeeViewModel : OnPropertyChangedClass
     {
         private byte[] _userImage;

         public byte[] UserImage 
        {
            get => _userImage; 

            // *** I don't get here with debugging.***

            set => SetProperty(ref _userImage, value); 
        }
     }
代码语言:javascript
复制
    public abstract class OnPropertyChangedClass : INotifyPropertyChanged
    {
        /// <inheritdoc cref="INotifyPropertyChanged"/>
        public event PropertyChangedEventHandler PropertyChanged;

        protected void RaisePropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        protected void SetProperty<T>(ref T propertyFiled, T newValue, [CallerMemberName] string propertyName = null)
        {
            if (!object.Equals(propertyFiled, newValue))
            {
                T oldValue = propertyFiled;
                propertyFiled = newValue;
                RaisePropertyChanged(propertyName);

                OnPropertyChanged(propertyName, oldValue, newValue);
            }
        }

        protected virtual void OnPropertyChanged(string propertyName, object oldValue, object newValue) { }
    }
EN

回答 1

Stack Overflow用户

发布于 2021-07-25 11:45:00

代码语言:javascript
复制
    protected override void OnAttachedTo(View bindable)
    {

        BindingContext = bindable.BindingContext;
        bindable.BindingContextChanged += Bindable_BindingContextChanged;
        /* Some Code */
        base.OnAttachedTo(bindable);
    }

    protected override void OnDetachingFrom(View bindable)
    {
        bindable.BindingContextChanged -= Bindable_BindingContextChanged;
        /* Some Code */
        base.OnDetachingFrom(bindable);
    }

    private void Bindable_BindingContextChanged(object sender, EventArgs e)
    {
        if (sender is View view)
        {
            BindingContext = (sender as View).BindingContext;
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68512213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档