Esempio n. 1
0
        /// <summary>
        /// Load string content
        /// </summary>
        /// <param name="content"></param>
        /// <param name="separator"></param>
        /// <returns></returns>
        public bool Load(string content, char separator = ',')
        {
            //Dispose records
            ClearRecord();
            if (string.IsNullOrEmpty(content))
            {
                ZDebug.LogError(string.Format("CSV file content empty!"));
                return(false);
            }

            bool check = CheckLegal(content, separator);

            if (!check)
            {
                return(false);
            }

            Separator = separator;
            _records  = new List <List <string> >();
            foreach (string row in content.Split('\r').Where(line => !string.IsNullOrEmpty(line.Trim())))
            {
                List <string> columns = row.Split(separator).Select(s => s.Trim()).ToList();
                //Check each row's column count. They must match
                if (ColumnCount != 0 && columns.Count != ColumnCount)
                {
                    ZDebug.LogError(
                        string.Format("CSV parsing error at line {0} : columns counts do not match! Separator: '{1}'",
                                      content.IndexOf(row), separator));
                    return(false);
                }
                ColumnCount = columns.Count;
                _records.Add(columns);
            }
            RowCount = _records.Count;

            if (_records == null || !_records.Any())
            {
                ZDebug.LogWarning(string.Format("CSV file parsing failed(empty records)!"));
                return(false);
            }

            return(true);
        }
Esempio n. 2
0
        public void Register <T>(T bindable) where T : class
        {
            if (Attribute.IsDefined(bindable.GetType(), typeof(ViewModelAttribute)))
            {
                if (!_viewModels.TryAdd(bindable.GetType(), bindable))
                {
                    ZDebug.LogError(string.Format("Register mvvm binding failed. type: {0}, object: {1}", bindable.GetType(), bindable));
                }
            }
            if (Attribute.IsDefined(bindable.GetType(), typeof(ViewAttribute)))
            {
                if (!_views.SafeAdd(bindable))
                {
                    ZDebug.LogError(string.Format("Register mvvm binding failed. type: {0}, object: {1}", bindable.GetType(), bindable));
                }
            }

            _groups.Clear();

            foreach (object view in _views)
            {
                Type viewModelType =
                    ((ViewAttribute)Attribute.GetCustomAttribute(view.GetType(), typeof(ViewAttribute)))
                    .SourceType;
                if (viewModelType == null)
                {
                    ZDebug.LogError(string.Format("View class has no viewModel class! view type: {0}", view.GetType()));
                    continue;
                }
                object viewModel = _viewModels.TryGet(viewModelType);
                if (viewModel == null)
                {
                    ZDebug.LogWarning(
                        string.Format(
                            "It may happend when view has been registered but view model has not yet. View: {0}, ViewModel: {1}", view,
                            viewModelType));
                    continue;
                }

                foreach (
                    MemberInfo member in
                    view.GetType().GetMembers().Where(p => Attribute.IsDefined(p, typeof(BindingMemberAttribute))))
                {
                    BindingGroup group = new BindingGroup();
                    group.ViewMember = member;
                    group.View       = view;
                    group.ViewModel  = viewModel;

                    string bindingKey =
                        ((BindingMemberAttribute)Attribute.GetCustomAttribute(member, typeof(BindingMemberAttribute)))
                        .BindingKey;
                    switch (member.MemberType)
                    {
                    case MemberTypes.Event:
                    {
                        Delegate del = Delegate.CreateDelegate(((EventInfo)member).EventHandlerType, viewModel, bindingKey, false,
                                                               false);
                        if (del == null)
                        {
                            ZDebug.LogError(string.Format("Binding method to event failed! event: {0}, methodName: {1}", member, bindingKey));
                        }
                        else
                        {
                            ((EventInfo)member).AddEventHandler(view, del);
                        }
                    }
                    break;

                    case MemberTypes.Field:
                        break;

                    case MemberTypes.Method:
                    {
                        MethodInfo method = viewModelType.GetMethod(bindingKey);

                        if (method.ReturnType == ((MethodInfo)member).ReturnType)
                        {
                            if (method.GetParameters().Length == ((MethodInfo)member).GetParameters().Length)
                            {
                                bool ok = true;
                                for (int i = 0; i < method.GetParameters().Length; i++)
                                {
                                    if (method.GetParameters()[i].ParameterType != ((MethodInfo)member).GetParameters()[i].ParameterType)
                                    {
                                        ok = false;
                                    }
                                }
                                if (ok)
                                {
                                    group.ViewModelMember = method;
                                    break;
                                }
                            }
                        }

                        ZDebug.LogError(string.Format("View method does not match view model method! {0}, {1}",
                                                      member, method));
                    }
                    break;

                    case MemberTypes.Property:
                    {
                        if (!((PropertyInfo)member).CanRead || !((PropertyInfo)member).CanWrite)
                        {
                            ZDebug.LogError(string.Format("View property is not accessable! {2} Read: {0}, Write: {1}",
                                                          ((PropertyInfo)member).CanRead, ((PropertyInfo)member).CanWrite, member));
                            break;
                        }
                        PropertyInfo prop = viewModelType.GetProperty(bindingKey);
                        if (!prop.CanRead || !prop.CanWrite)
                        {
                            ZDebug.LogError(string.Format("View model property is not accessable! {2} Read: {0}, Write: {1}",
                                                          prop.CanRead, prop.CanWrite, prop));
                            break;
                        }
                        if (((PropertyInfo)member).PropertyType != prop.PropertyType)
                        {
                            ZDebug.LogError(string.Format("View property does not match view model property! {0}, {1}",
                                                          member, prop));
                            break;
                        }
                        group.ViewModelMember = prop;
                    }
                    break;

                    default:
                        ZDebug.LogError("Member type not surported for binding! type: " + member.MemberType);
                        break;
                    }

                    if (group.CanUpdate)
                    {
                        _groups.Add(group);
                    }
                }
            }

            foreach (object viewModel in _viewModels.Values)
            {
                if (viewModel is INotifyPropertyChanged)
                {
                    ((INotifyPropertyChanged)viewModel).PropertyChanged += (sender, args) => Notify(sender, args.PropertyName);
                }
            }
        }