如何解决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 举报,一经查实,本站将立刻删除。