Xamarin.Forms 固定表头与 数据绑定

 初学Xamarin  固定表头 花了些时间,一开始给ListView.Header误导了,上forums.xamarin.com 也没找到解答.

最后还是通过Grid解决,发一下,怕忘记了.

上XAML代码:  




    

        
            

        
            

        
            

        
            

        
public partial class SampleSettingsPage : ContentPage
    {
        public SampleSettingsPage()
        {
            InitializeComponent();

            if (colorListView.SelectedItem != null)
            {
                colorListView.ScrollTo(colorListView.SelectedItem,
                                       ScrollToPosition.MakeVisible,
                                       false);
            }
             
            
        }
    }

  public class SampleSettingsViewModel : INotifyPropertyChanged
    {
        string name;
        DateTime birthDate;
        bool codesInCSharp;
        double numberOfCopies;
        NamedColor backgroundNamedColor;

        public event PropertyChangedEventHandler PropertyChanged;

        public SampleSettingsViewModel(IDictionary dictionary)
        {
            Name = GetDictionaryEntry(dictionary, "Name");
            BirthDate = GetDictionaryEntry(dictionary, "BirthDate", new DateTime(2019, 1, 1));
            CodesInCSharp = GetDictionaryEntry(dictionary, "CodesInCSharp");
            NumberOfCopies = GetDictionaryEntry(dictionary, "NumberOfCopies", 1.0);
            BackgroundNamedColor = NamedColor.Find(GetDictionaryEntry(dictionary, "BackgroundNamedColor", "White"));
        }

        public string Name
        {
            set { SetProperty(ref name, value); }
            get { return name; }
        }

        public DateTime BirthDate
        {
            set { SetProperty(ref birthDate, value); }
            get { return birthDate; }
        }

        public bool CodesInCSharp
        {
            set { SetProperty(ref codesInCSharp, value); }
            get { return codesInCSharp; }
        }

        public double NumberOfCopies
        {
            set { SetProperty(ref numberOfCopies, value); }
            get { return numberOfCopies; }
        }

        public NamedColor BackgroundNamedColor
        {
            set
            {
                if (SetProperty(ref backgroundNamedColor, value))
                {
                    OnPropertyChanged("BackgroundColor");
                }
            }
            get { return backgroundNamedColor; }
        }

        public Color BackgroundColor
        {
            get { return BackgroundNamedColor?.Color ?? Color.White; }
        }

        public void SaveState(IDictionary dictionary)
        {
            dictionary["Name"] = Name;
            dictionary["BirthDate"] = BirthDate;
            dictionary["CodesInCSharp"] = CodesInCSharp;
            dictionary["NumberOfCopies"] = NumberOfCopies;
            dictionary["BackgroundNamedColor"] = BackgroundNamedColor.Name;
        }

        T GetDictionaryEntry(IDictionary dictionary, string key, T defaultValue = default(T))
        {
            return dictionary.ContainsKey(key) ? (T)dictionary[key] : defaultValue;
        }

        bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null)
        {
            if (Object.Equals(storage, value))
                return false;

            storage = value;
            OnPropertyChanged(propertyName);
            return true;
        }

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


  public class NamedColor : IEquatable, IComparable
    {
        // Instance members
        private NamedColor()
        {
        }

        public string Name { private set; get; }

        public string FriendlyName { private set; get; }

        public Color Color { private set; get; }

        public string RgbDisplay { private set; get; }

        public bool Equals(NamedColor other)
        {
            return Name.Equals(other.Name);
        }

        public int CompareTo(NamedColor other)
        {
            return Name.CompareTo(other.Name);
        }

        // Static members
        static NamedColor()
        {
            List all = new List();
            StringBuilder stringBuilder = new StringBuilder();

            // Loop through the public static fields of the Color structure.
            foreach (FieldInfo fieldInfo in typeof(Color).GetRuntimeFields())
            {
                if (fieldInfo.IsPublic &&
                    fieldInfo.IsStatic &&
                    fieldInfo.FieldType == typeof(Color))
                {
                    // Convert the name to a friendly name.
                    string name = fieldInfo.Name;
                    stringBuilder.Clear();
                    int index = 0;

                    foreach (char ch in name)
                    {
                        if (index != 0 && Char.IsUpper(ch))
                        {
                            stringBuilder.Append(' ');
                        }
                        stringBuilder.Append(ch);
                        index++;
                    }

                    // Instantiate a NamedColor object.
                    Color color = (Color)fieldInfo.GetValue(null);

                    NamedColor namedColor = new NamedColor
                    {
                        Name = name,
                        FriendlyName = stringBuilder.ToString(),
                        Color = color,
                        RgbDisplay = String.Format("{0:X2}-{1:X2}-{2:X2}",
                                                   (int)(255 * color.R),
                                                   (int)(255 * color.G),
                                                   (int)(255 * color.B))
                    };

                    // Add it to the collection.
                    all.Add(namedColor);
                }
            }
            all.TrimExcess();
            all.Sort();
            All = all;
        }

        public static IList All { private set; get; }

        public static NamedColor Find(string name)
        {
            return ((List)All).Find(nc => nc.Name == name);
        }

        public static string GetNearestColorName(Color color)
        {
            double shortestDistance = 1000;
            NamedColor closestColor = null;

            foreach (NamedColor namedColor in NamedColor.All)
            {
                double distance = Math.Sqrt(Math.Pow(color.R - namedColor.Color.R, 2) +
                                            Math.Pow(color.G - namedColor.Color.G, 2) +
                                            Math.Pow(color.B - namedColor.Color.B, 2));

                if (distance < shortestDistance)
                {
                    shortestDistance = distance;
                    closestColor = namedColor;
                }
            }
            return closestColor.Name;
        }
    }

 

你可能感兴趣的:(Xamarin.Forms,Xamarin.Forms,表头固定)