从代码设置绑定不适用于xamarin.forms应用程序

时间:2017-01-11 07:55:12

标签: c# mvvm xamarin xamarin.forms

我试图在我的xamarin.forms应用程序中使用手风琴。我可以毫无问题地使用它但是当我想将它用于viewmodels.No数据以手风琴显示 我的viewmodel是这样的;

 namespace xamarinapp
{
   public class TestViewModel : ViewModelBase
    {
        private readonly IServiceWrapper _myServiceWrapper;
        private readonly IAuthenticationService _authenticationService;

        public string viemodelName { get; set; }

        private bool UserLogCheck = false;
        private ObservableRangeCollection<dataInfro> _Acclist;
        public ObservableRangeCollection<Models.dataInfro> Acclist
        {
            get
            {
                return _Acclist;
            }
            set
            {
                _Acclist = value;
                 RaisePropertyChanged(() => Acclist);
            }
        }

        public override async Task InitializeAsync(object navigationData)
        {
            UserLogCheck = DependencyService.Get<LoginInterface>().LoginExists();
            if (!UserLogCheck)
            {
                NavigationService.NavigateToAsync<LoginViewModel>();
            }
            else
            {
              await  getData();
            }
        }
        public ICommand ItemSelectedCommand2 => new Command<dataInfro>(OntaptedItem);
        private async void OntaptedItem(dataInfro item)
        {

            await NavigationService.NavigateToAsync<OgrenciNotViewModel>(item.ogrId.ToString());

        }
        public TestViewModel(IServiceWrapper myServiceWrapper)
        {
            _myServiceWrapper = myServiceWrapper;
            _Acclist = new ObservableRangeCollection<dataInfro>();

        }
        private async Task getData()
        {
            ServiceWrapper serviceWrapper = new ServiceWrapper();
            var loginUser = DependencyService.Get<LoginInterface>().getAccount();
            var data =  await _myServiceWrapper.GetDataSecure<Ogrencilik>("GetDataUrl", loginUser);
            Acclist =new ObservableRangeCollection<dataInfro>(data.dataCollect);
        }
    }

}

手风琴自定义控件就像这样。(来自https://kimsereyblog.blogspot.com.tr/2016/10/build-accordion-view-in-xamarinforms.html

namespace xamarinapp
{
    public class DefaultTemplate : AbsoluteLayout
    {
        public DefaultTemplate()
        {
            this.Padding = 0;
            this.HeightRequest = 50;
            var title = new Label { HorizontalTextAlignment = TextAlignment.Start, HorizontalOptions = LayoutOptions.StartAndExpand };
            var price = new Label { HorizontalTextAlignment = TextAlignment.End, HorizontalOptions = LayoutOptions.End };
            this.Children.Add(title, new Rectangle(0, 0.5, 0.5, 1), AbsoluteLayoutFlags.All);
            this.Children.Add(price, new Rectangle(1, 0.5, 0.5, 1), AbsoluteLayoutFlags.All);
            title.SetBinding(Label.TextProperty, "name", stringFormat: "{0:c1}");
            price.SetBinding(Label.TextProperty, "balance", stringFormat: "{0:C2}");
        }
    }

    public class AccordionView : ScrollView
    {
        private StackLayout _layout = new StackLayout { Spacing = 1 };

        public DataTemplate Template { get; set; }
        public DataTemplate SubTemplate { get; set; }

        public static readonly BindableProperty ItemsSourceProperty =
            BindableProperty.Create(
                propertyName: "ItemsSource",
                returnType: typeof(IList),
                declaringType: typeof(AccordionSectionView),
                defaultValue: default(IList),
                propertyChanged: AccordionView.PopulateList);

        public IList ItemsSource
        {
            get { return (IList)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        public AccordionView()
        {
            var itemTemplate = new DataTemplate(typeof(DefaultTemplate));
            this.SubTemplate = itemTemplate;
            this.Template = new DataTemplate(() => (object)(new AccordionSectionView(itemTemplate, this)));
            this.Content = _layout;
        }

        void PopulateList()
        {
            _layout.Children.Clear();

            foreach (object item in this.ItemsSource)
            {
                var template = (View)this.Template.CreateContent();
                template.BindingContext = item;
                _layout.Children.Add(template);
            }
        }

        static void PopulateList(BindableObject bindable, object oldValue, object newValue)
        {
            if (oldValue == newValue) return;
            ((AccordionView)bindable).PopulateList();
        }
    }

    public class AccordionSectionView : StackLayout
    {
        private bool _isExpanded = false;
        private StackLayout _content = new StackLayout { HeightRequest = 0 };
        private Color _headerColor = Color.FromHex("0067B7");
        private ImageSource _arrowRight = ImageSource.FromFile("ic_keyboard_arrow_right_white_24dp.png");
        private ImageSource _arrowDown = ImageSource.FromFile("ic_keyboard_arrow_down_white_24dp.png");
        private AbsoluteLayout _header = new AbsoluteLayout();
        private Image _headerIcon = new Image { VerticalOptions = LayoutOptions.Center };
        private Label _headerTitle = new Label { TextColor = Color.White, VerticalTextAlignment = TextAlignment.Center, HeightRequest = 50 };
        private DataTemplate _template;

        public static readonly BindableProperty ItemsSourceProperty =
            BindableProperty.Create(
                propertyName: "ItemsSource",
                returnType: typeof(IList),
                declaringType: typeof(AccordionSectionView),
                defaultValue: default(IList),
                propertyChanged: AccordionSectionView.PopulateList);

        public IList ItemsSource
        {
            get { return (IList)GetValue(ItemsSourceProperty); }
            set { SetValue(ItemsSourceProperty, value); }
        }

        public static readonly BindableProperty TitleProperty =
            BindableProperty.Create(
                propertyName: "Title",
                returnType: typeof(string),
                declaringType: typeof(AccordionSectionView),
                propertyChanged: AccordionSectionView.ChangeTitle);

        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }

        public AccordionSectionView(DataTemplate itemTemplate, ScrollView parent)
        {
            _template = itemTemplate;
            _headerTitle.BackgroundColor = _headerColor;
            _headerIcon.Source = _arrowRight;
            _header.BackgroundColor = _headerColor;

            _header.Children.Add(_headerIcon, new Rectangle(0, 1, .1, 1), AbsoluteLayoutFlags.All);
            _header.Children.Add(_headerTitle, new Rectangle(1, 1, .9, 1), AbsoluteLayoutFlags.All);

            this.Spacing = 0;
            this.Children.Add(_header);
            this.Children.Add(_content);

            _header.GestureRecognizers.Add(
                new TapGestureRecognizer
                {
                    Command = new Command(async () =>
                    {
                        if (_isExpanded)
                        {
                            _headerIcon.Source = _arrowRight;
                            _content.HeightRequest = 0;
                            _content.IsVisible = false;
                            _isExpanded = false;
                        }
                        else
                        {
                            _headerIcon.Source = _arrowDown;
                            _content.HeightRequest = _content.Children.Count * 50;
                            _content.IsVisible = true;
                            _isExpanded = true;

                            // Scroll top by the current Y position of the section
                            if (parent.Parent is VisualElement)
                            {
                                await parent.ScrollToAsync(0, this.Y, true);
                            }
                        }
                    })
                }
            );
        }

        void ChangeTitle()
        {
            _headerTitle.Text = this.Title;
        }

        void PopulateList()
        {
            _content.Children.Clear();

            foreach (object item in this.ItemsSource)
            {
                var template = (View)_template.CreateContent();
                template.BindingContext = item;
                _content.Children.Add(template);
            }
        }

        static void ChangeTitle(BindableObject bindable, object oldValue, object newValue)
        {
            if (oldValue == newValue) return;
            ((AccordionSectionView)bindable).ChangeTitle();
        }

        static void PopulateList(BindableObject bindable, object oldValue, object newValue)
        {
            if (oldValue == newValue) return;
            ((AccordionSectionView)bindable).PopulateList();
        }
    }
}

我正试图像这样设置绑定

 [XamlCompilation(XamlCompilationOptions.Skip)]
    public partial class PageOgrenciNotModal : ContentPage
    {
        public PageOgrenciNotModal()
        {
            InitializeComponent();
        }
        protected override void OnBindingContextChanged()
        {
            base.OnBindingContextChanged();
            Accorview.SetBinding(AccordionView.ItemsSourceProperty, "Acclist");
            Accorview.Template.SetBinding(AccordionSectionView.TitleProperty, "Title");
            Accorview.Template.SetBinding(AccordionSectionView.ItemsSourceProperty, "List");
        }
    }

但没有任何事情发生。(注意:获取数据没有问题,我可以使用与listview相同的方法没有问题。)非常感谢,谢谢

2 个答案:

答案 0 :(得分:1)

如果您没有使用MVVM Framework,则必须自己设置页面的BindingContext

做类似的事情:

public PageOgrenciNotModal()
{
    InitializeComponent();
    BindingContext = new TestViewModel();

}

答案 1 :(得分:1)

这个

Accorview.SetBinding(ListView.ItemsSourceProperty, "Accorlist");

看起来很可疑。

恕我直言,应该是

Accorview.SetBinding(AccordionView.ItemsSourceProperty, "Accorlist");