Xamarin 表单自定义可绑定属性未更新

问题描述

我想弄清楚如何更新自定义控件中的自定义属性。我的问题是,当我修改视图模型中的集合时,它不会触发控件内部的更新。但是或调试目的,我在 lsitview 中放置了我想要可视化的项目,我可以看到它们正确显示

    <?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:xct="clr-namespace:Xamarin.CommunityToolkit.UI.Views;assembly=Xamarin.CommunityToolkit"
            xmlns:viewmodels="clr-namespace:Treeview_DragAndDrop.viewmodels"
             x:Class="Treeview_DragAndDrop.MainPage"
             xmlns:controls="clr-namespace:Treeview_DragAndDrop.Controls">
    <ContentPage.BindingContext>
        <viewmodels:HomeScreenviewmodel />
    </ContentPage.BindingContext>
    <StackLayout>
        <StackLayout Orientation="Horizontal">
            <controls:TreeviewControl ItemsSource="{Binding Path=FromTreeList,Mode=TwoWay}" WidthRequest="500"></controls:TreeviewControl>
            <controls:TreeviewControl ItemsSource="{Binding Path=ToTreeList,Mode=TwoWay}" WidthRequest="500"></controls:TreeviewControl>
        </StackLayout>
        <ListView ItemsSource="{Binding Path=FromTreeList}"></ListView>        
    </StackLayout>

视图模型

 public class HomeScreenviewmodel
    {
        private ObservableCollection<TreeNodeModel> toTreeList;
        private ObservableCollection<TreeNodeModel> fromTreeList;

        public ObservableCollection<TreeNodeModel> FromTreeList { get => fromTreeList; set => fromTreeList = value; }
        public ObservableCollection<TreeNodeModel> ToTreeList { get => toTreeList; set => toTreeList = value; }

        public HomeScreenviewmodel()
        {
            FromTreeList = new ObservableCollection<TreeNodeModel>();
            ToTreeList = new ObservableCollection<TreeNodeModel>();
            Task.Run(() => CreateTreeListCollections());

        }

        private void CreateTreeListCollections()
        {
            Thread.Sleep(10000);
            Device.BeginInvokeOnMainThread(() =>
            {
                FromTreeList.Add(new TreeNodeModel()
                {
                    Id = 1,Text = "Első",Children = new List<TreeNodeModel>()
                    {
                        new TreeNodeModel() {
                            Id = 2,Text = "Első.Egy",}
                    }
                });
                FromTreeList.Add(new TreeNodeModel()
                {
                    Id = 1,Text = "Masodik",Text = "Masodik.Egy",Children=new List<TreeNodeModel>()
                            {
                                new TreeNodeModel(){
                                    Id = 1,Text = "Masodik.Egy.Egy",Children = new List<TreeNodeModel>()
                                     {
                                       new TreeNodeModel() {
                                            Id = 2,Text = "Masodik.Egy.Egy.Egy",}
                                    }
                                }
                            }
                        }
                    }
                });
            });

            Device.BeginInvokeOnMainThread(() =>
            {
                ToTreeList.Add(new TreeNodeModel()
                {
                    Id = 1,}
                    }
                });
                ToTreeList.Add(new TreeNodeModel()
                {
                    Id = 1,}
                    }
                });
            });
        }
    }

我的自定义控件

public class TreeviewControl : ScrollView
    {
        private readonly StackLayout _StackLayout = new StackLayout { Orientation = StackOrientation.Vertical };

        public ObservableCollection<TreeNodeModel> ItemsSource
        {
            get { return (ObservableCollection<TreeNodeModel>)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty,value); }
        }


        public static readonly BindableProperty ItemsSourceProperty = BindableProperty.Create(propertyName: nameof(ItemsSource),returnType: typeof(ObservableCollection<TreeNodeModel>),declaringType: typeof(TreeviewControl),defaultValue: new ObservableCollection<TreeNodeModel>(),defaultBindingMode: BindingMode.TwoWay,propertyChanged: ItemsSourceChanged);
        private static void ItemsSourceChanged(BindableObject bindable,object oldValue,object newValue)
        {
            var control = (TreeviewControl)bindable;
            control.ItemsSource = (ObservableCollection<TreeNodeModel>)newValue;

            if (control.ItemsSource != null)
            {
                Debug.WriteLine(control.ItemsSource.Count);
                foreach (var rootNode in control.ItemsSource)
                {
                    control._StackLayout.Children.Add(new TreeViewNode(rootNode).CreateNodeView());
                }
            }

        }

        public TreeviewControl()
        {
            Content = _StackLayout;
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)