Xamarin.Forms 属性不定、支持首行列头可以锁定的自制DataGrid

 

问题1 动态对象加载,列数量不固定

定义一个超长属性类型 通过反射赋值
绑定给ListView 里面嵌套一个Grid
ListView BindingContextChanged Grid动态加载列和内容

public class HistoricalDataModel
    {
        public List<TransducerParam> ModelList = new List<TransducerParam>();
        public DateTime NDate { get; set; }
        #region
        public TransducerParam D1 { get; set; }
        public TransducerParam D2 { get; set; }
        public TransducerParam D3 { get; set; }
        public TransducerParam D4 { get; set; }
        public TransducerParam D5 { get; set; }
        public TransducerParam D6 { get; set; }
        public TransducerParam D7 { get; set; }
        public TransducerParam D8 { get; set; }
        public TransducerParam D9 { get; set; }
        public TransducerParam D10 { get; set; }
        #endregion
        public HistoricalDataModel(List<TransducerParam> modelList)
        {
            int i = 1;
            modelList.ForEach(x => {
                TransducerParam tParam = x.Copy();
                typeof(HistoricalDataModel).GetProperty("D" + i).SetValue(this, tParam);
                ModelList.Add(tParam);
                if(x.Name == "nDate")
                    NDate = DateTime.FromOADate(x.Value);
            });
        }

    }

问题2 如何锁定列头和首行 并跟随数据滚动
列头单独用一个grid,首行单独用一个ListView

分成4个区间
1 左上固定长度 首行的列名,
2 右上 其他列名grid 外层套ScrollView
3 左下 首类所有数据行 外层套ScrollView
4 右下 其他列所有数据行 外层套ScrollView
注意宽度上下对齐
ScrollView的Scrolled事件,控制其他ScrollView同步滚动

private void bodyScrollView_Scrolled(object sender, ScrolledEventArgs e)
        {
            headScrolView.ScrollToAsync(e.ScrollX, headScrolView.ScrollY, false);
            rowScrollView.ScrollToAsync(rowScrollView.ScrollX, e.ScrollY, false);
            statisticsScrolView.ScrollToAsync(e.ScrollX, statisticsScrolView.ScrollY, false);
        }

问题3 ScrollView内嵌套的ListView WebView之类带滚轮的内容,滚轮效果失效
加载数据后,根据数据内容大小 将控件的长宽按最大显示数据的长宽定义。
//列宽定义120 ,Margin="0" RowSpacing="0" ColumnSpacing="0"
dataListView.WidthRequest = viewModel.TPList.Count * 120;
//行高24,ListView.Footer中的Button高40
dataListView.HeightRequest = (viewModel.Datas.Count + 1) * 24.4+40;
//行高24,ListView.Footer中的Button高40
nDateListView.HeightRequest = (viewModel.Datas.Count + 1) * 24.4+40;

 

posted @ 2020-03-26 16:56  Hs冰哥  阅读(322)  评论(0编辑  收藏  举报