using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Controls; using System.Windows.Media; using FWindSoft.Data; using FWindSoft.SystemExtensions; using FWindSoft.Wpf.Controls; namespace FWindSoft.Wpf.History { /// /// 控件数据保存 /// public class ControlDataManager { private List m_ValueProviders; public ControlDataManager() { m_ValueProviders = new List(); ValueProviders = new ReadOnlyCollection(m_ValueProviders); } public ControlDataManager(List providers) : this() { m_ValueProviders.AddRange(providers); } public ReadOnlyCollection ValueProviders { get; private set; } public void RegistValueProvider(ElementValueProvider provider) { this.m_ValueProviders.Insert(0, provider); } #region 静态方法 /// /// 获取默认的provider /// /// public static List GetDefaultProvider() { List providers = new List(); providers.Add(new TextBoxValueProvider()); providers.Add(new CheckBoxValueProvider()); providers.Add(new ComBoxValueProvider()); providers.Add(new ListBoxValueProvider()); providers.Add(new RadioValueProvider()); return providers; } #endregion private ElementValueProvider GetElementValueProvider(Control control) { ElementValueProvider provider = HistoryControl.GetValueAdapter(control); var controlType = control.GetType(); //if (provider == null) //{ // provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(controlType)); //} if (provider == null) { var objectType = typeof(object); for (Type tempType = controlType; tempType != objectType && tempType != null; tempType = tempType.BaseType) { provider = this.ValueProviders.FirstOrDefault(c => c.IsAdapterType(tempType)); if (provider!=null) { break; } } //provider = this.ValueProviders.FirstOrDefault(c => controlType.IsBaseType(c.RefControlType)); } if (provider != null) { provider = provider.Clone(); provider.SetAdapterControl(control); } return provider; } private IValueProvider GetValueProvider(Control control) { IValueProvider provider = null; do { if (control is IValueProvider) { provider = (IValueProvider)control; break; } provider = GetElementValueProvider(control); } while (false); return provider; } #region 公开方法 /// /// 获取数据 /// /// public List GetControlData(Visual visual) { List items = new List(); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++) { Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i); if (childVisual != null) { Control control = childVisual as Control; if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid)) { var provider = GetValueProvider(control); if (provider != null) { var saveItem = new ControlSaveItem(); saveItem.ControlId = control.Uid; saveItem.ControlName = control.Name; saveItem.ControlType = control.GetType().Name; saveItem.ControlValue = provider.GetValue().ToString(); items.Add(saveItem); } else { items.AddRange(GetControlData(control)); } } else { items.AddRange(GetControlData(childVisual)); } } } return items; } /// /// 设置数据 /// /// /// public void SetControlData(Visual visual, List datas) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++) { Visual childVisual = (Visual)VisualTreeHelper.GetChild(visual, i); if (childVisual != null) { Control control = childVisual as Control; if (control != null && HistoryControl.GetIsSave(control) && !string.IsNullOrWhiteSpace(control.Uid)) { var saveItem = datas.FirstOrDefault(s => s.ControlId == control.Uid); var provider = GetValueProvider(control); if (provider != null && saveItem != null) { provider.SetValue(saveItem.ControlValue); } else { SetControlData(childVisual, datas); } } else { SetControlData(childVisual, datas); } } } } } #endregion }