/// <summary> /// Update IsEnabled on properties marked [Optional(..)] /// </summary> /// <param name = "propertyViewModel"> /// </param> private void UpdateOptionalProperties(PropertyViewModel propertyViewModel) { foreach (PropertyViewModel prop in propertyMap.Values) { var oprop = prop as OptionalPropertyViewModel; if (oprop == null) { continue; } if (oprop.OptionalPropertyName == propertyViewModel.PropertyName) { if (propertyViewModel.Value is bool) { oprop.IsEnabled = (bool)propertyViewModel.Value; } } } }
/// <summary> /// Updates the property header and tooltip /// </summary> /// <param name = "instanceType"> /// Type of the object being edited /// </param> /// <param name = "propertyViewModel"> /// The property viewmodel /// </param> private void LocalizePropertyHeader(Type instanceType, PropertyViewModel propertyViewModel) { propertyViewModel.Header = GetLocalizedString(instanceType, propertyViewModel.Name); propertyViewModel.ToolTip = GetLocalizedTooltip(instanceType, propertyViewModel.Name); // [DisplayName(..)] and [Description(...)] attributes overrides the localized strings var dna = AttributeHelper.GetFirstAttribute <DisplayNameAttribute>(propertyViewModel.Descriptor); var da = AttributeHelper.GetFirstAttribute <DescriptionAttribute>(propertyViewModel.Descriptor); if (dna != null) { propertyViewModel.Header = dna.DisplayName; } if (da != null) { propertyViewModel.ToolTip = da.Description; } }
public virtual PropertyViewModel CreateViewModel(object instance, PropertyDescriptor descriptor) { PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(instance); PropertyViewModel propertyViewModel = null; string optionalPropertyName; if (IsOptional(descriptor, out optionalPropertyName)) { propertyViewModel = new OptionalPropertyViewModel(instance, descriptor, optionalPropertyName, owner); } if (IsPassword(descriptor)) { propertyViewModel = new PasswordPropertyViewModel(instance, descriptor, owner); } if (IsResettable(descriptor)) { propertyViewModel = new ResettablePropertyViewModel(instance, descriptor, owner); } if (UsePropertyPattern != null) { string usePropertyName = String.Format(UsePropertyPattern, descriptor.Name); PropertyDescriptor useDescriptor = pdc.Find(usePropertyName, false); if (useDescriptor != null) { propertyViewModel = new OptionalPropertyViewModel(instance, descriptor, useDescriptor, owner); } } bool showHeader; if (IsWide(descriptor, out showHeader)) { propertyViewModel = new WidePropertyViewModel(instance, descriptor, showHeader, owner); } // If bool properties should be shown as checkbox only (no header label), we create a CheckBoxPropertyViewModel if (descriptor.PropertyType == typeof(bool) && owner != null && !owner.ShowBoolHeader) { propertyViewModel = new CheckBoxPropertyViewModel(instance, descriptor, owner); } double min, max, largeChange, smallChange; double tickFrequency; bool snapToTicks; TickPlacement tickPlacement; if (IsSlidable(descriptor, out min, out max, out largeChange, out smallChange, out tickFrequency, out snapToTicks, out tickPlacement)) { propertyViewModel = new SlidablePropertyViewModel(instance, descriptor, owner) { SliderMinimum = min, SliderMaximum = max, SliderLargeChange = largeChange, SliderSmallChange = smallChange, SliderSnapToTicks = snapToTicks, SliderTickFrequency = tickFrequency, SliderTickPlacement = tickPlacement } } ; // FilePath string filter, defaultExtension; bool useOpenDialog; if (IsFilePath(descriptor, out filter, out defaultExtension, out useOpenDialog)) { propertyViewModel = new FilePathPropertyViewModel(instance, descriptor, owner) { Filter = filter, DefaultExtension = defaultExtension, UseOpenDialog = useOpenDialog } } ; // DirectoryPath if (IsDirectoryPath(descriptor)) { propertyViewModel = new DirectoryPathPropertyViewModel(instance, descriptor, owner); } // Default property (using textbox) if (propertyViewModel == null) { var tp = new PropertyViewModel(instance, descriptor, owner); propertyViewModel = tp; } // Check if the AutoUpdatingText attribute is set (this will select the template that has a text binding using UpdateSourceTrigger=PropertyChanged) if (IsAutoUpdatingText(descriptor)) { propertyViewModel.AutoUpdateText = true; } propertyViewModel.FormatString = GetFormatString(descriptor); //var ha = AttributeHelper.GetFirstAttribute<HeightAttribute>(descriptor); //if (ha != null) // propertyViewModel.Height = ha.Height; propertyViewModel.Height = GetHeight(descriptor); propertyViewModel.MaxLength = GetMaxLength(descriptor); if (propertyViewModel.Height > 0 || IsMultilineText(descriptor)) { propertyViewModel.AcceptsReturn = true; propertyViewModel.TextWrapping = TextWrapping.Wrap; } var soa = AttributeHelper.GetFirstAttribute <SortOrderAttribute>(descriptor); if (soa != null) { propertyViewModel.SortOrder = soa.SortOrder; } if (IsEnabledPattern != null) { string isEnabledName = String.Format(IsEnabledPattern, descriptor.Name); propertyViewModel.IsEnabledDescriptor = pdc.Find(isEnabledName, false); } if (IsVisiblePattern != null) { string isVisibleName = String.Format(IsVisiblePattern, descriptor.Name); propertyViewModel.IsVisibleDescriptor = pdc.Find(isVisibleName, false); } return(propertyViewModel); }
public virtual PropertyViewModel CreateViewModel(object instance, PropertyDescriptor descriptor) { PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties(instance); PropertyViewModel propertyViewModel = null; string optionalPropertyName; if (IsOptional(descriptor, out optionalPropertyName)) propertyViewModel = new OptionalPropertyViewModel(instance, descriptor, optionalPropertyName, owner); if (IsPassword(descriptor)) propertyViewModel = new PasswordPropertyViewModel(instance, descriptor, owner); if (IsResettable(descriptor)) propertyViewModel = new ResettablePropertyViewModel(instance, descriptor, owner); if (UsePropertyPattern != null) { string usePropertyName = String.Format(UsePropertyPattern, descriptor.Name); PropertyDescriptor useDescriptor = pdc.Find(usePropertyName, false); if (useDescriptor != null) propertyViewModel = new OptionalPropertyViewModel(instance, descriptor, useDescriptor, owner); } bool showHeader; if (IsWide(descriptor, out showHeader)) propertyViewModel = new WidePropertyViewModel(instance, descriptor, showHeader, owner); // If bool properties should be shown as checkbox only (no header label), we create a CheckBoxPropertyViewModel if (descriptor.PropertyType == typeof(bool) && owner != null && !owner.ShowBoolHeader) propertyViewModel = new CheckBoxPropertyViewModel(instance, descriptor, owner); double min, max, largeChange, smallChange; double tickFrequency; bool snapToTicks; TickPlacement tickPlacement; if (IsSlidable(descriptor, out min, out max, out largeChange, out smallChange, out tickFrequency, out snapToTicks, out tickPlacement)) propertyViewModel = new SlidablePropertyViewModel(instance, descriptor, owner) { SliderMinimum = min, SliderMaximum = max, SliderLargeChange = largeChange, SliderSmallChange = smallChange, SliderSnapToTicks = snapToTicks, SliderTickFrequency = tickFrequency, SliderTickPlacement = tickPlacement }; // FilePath string filter, defaultExtension; bool useOpenDialog; if (IsFilePath(descriptor, out filter, out defaultExtension, out useOpenDialog)) propertyViewModel = new FilePathPropertyViewModel(instance, descriptor, owner) { Filter = filter, DefaultExtension = defaultExtension, UseOpenDialog = useOpenDialog }; // DirectoryPath if (IsDirectoryPath(descriptor)) propertyViewModel = new DirectoryPathPropertyViewModel(instance, descriptor, owner); // Default property (using textbox) if (propertyViewModel == null) { var tp = new PropertyViewModel(instance, descriptor, owner); propertyViewModel = tp; } // Check if the AutoUpdatingText attribute is set (this will select the template that has a text binding using UpdateSourceTrigger=PropertyChanged) if (IsAutoUpdatingText(descriptor)) propertyViewModel.AutoUpdateText = true; propertyViewModel.FormatString = GetFormatString(descriptor); //var ha = AttributeHelper.GetFirstAttribute<HeightAttribute>(descriptor); //if (ha != null) // propertyViewModel.Height = ha.Height; propertyViewModel.Height = GetHeight(descriptor); propertyViewModel.MaxLength = GetMaxLength(descriptor); if (propertyViewModel.Height > 0 || IsMultilineText(descriptor)) { propertyViewModel.AcceptsReturn = true; propertyViewModel.TextWrapping = TextWrapping.Wrap; } var soa = AttributeHelper.GetFirstAttribute<SortOrderAttribute>(descriptor); if (soa != null) propertyViewModel.SortOrder = soa.SortOrder; if (IsEnabledPattern != null) { string isEnabledName = String.Format(IsEnabledPattern, descriptor.Name); propertyViewModel.IsEnabledDescriptor = pdc.Find(isEnabledName, false); } if (IsVisiblePattern != null) { string isVisibleName = String.Format(IsVisiblePattern, descriptor.Name); propertyViewModel.IsVisibleDescriptor = pdc.Find(isVisibleName, false); } return propertyViewModel; }
private DataTemplate FindDataTemplate(PropertyViewModel propertyViewModel, FrameworkElement element) { Type propertyType = propertyViewModel.PropertyType; if (Nullable.GetUnderlyingType(propertyType) != null) { propertyType = Nullable.GetUnderlyingType(propertyType); } // Try to find a template for the given type var template = TryToFindDataTemplate(element, propertyType); if (template != null) { return(template); } // DataTemplates for enum types if (propertyType.BaseType == typeof(Enum)) { var rba = propertyViewModel.Descriptor.Attributes[typeof(RadioButtonsAttribute)] as RadioButtonsAttribute; int nValues = Enum.GetValues(propertyType).FilterOnBrowsableAttribute().Count; if (rba != null) { if (rba.UseRadioButtons) { nValues = Owner.EnumAsRadioButtonsLimit; } else { nValues = Owner.EnumAsRadioButtonsLimit + 1; } } if (nValues > Owner.EnumAsRadioButtonsLimit) { template = TryToFindDataTemplate(element, "ComboBoxEnumTemplate"); } else { template = TryToFindDataTemplate(element, "RadioButtonsEnumTemplate"); } if (template != null) { return(template); } } // Try to find a template for the base type while (propertyType.BaseType != null) { propertyType = propertyType.BaseType; template = TryToFindDataTemplate(element, propertyType); if (template != null) { return(template); } } // If the Slidable attribute is set, use the 'sliderBox' template if (propertyViewModel is SlidablePropertyViewModel) { template = TryToFindDataTemplate(element, "SliderBoxTemplate"); if (template != null) { return(template); } } if (propertyViewModel is FilePathPropertyViewModel) { template = TryToFindDataTemplate(element, "FilePathTemplate"); if (template != null) { return(template); } } if (propertyViewModel is DirectoryPathPropertyViewModel) { template = TryToFindDataTemplate(element, "DirectoryPathTemplate"); if (template != null) { return(template); } } if (propertyViewModel is PasswordPropertyViewModel) { template = TryToFindDataTemplate(element, "PasswordTemplate"); if (template != null) { return(template); } } // Use the default template (TextBox) if (propertyViewModel.AutoUpdateText) { template = TryToFindDataTemplate(element, "DefaultTemplateAutoUpdate"); } else { template = TryToFindDataTemplate(element, "DefaultTemplate"); } return(template); }
/// <summary> /// Update IsEnabled on properties marked [Optional(..)] /// </summary> /// <param name = "propertyViewModel"> /// </param> private void UpdateOptionalProperties(PropertyViewModel propertyViewModel) { foreach (PropertyViewModel prop in propertyMap.Values) { var oprop = prop as OptionalPropertyViewModel; if (oprop == null) { continue; } if (oprop.OptionalPropertyName == propertyViewModel.PropertyName) { if (propertyViewModel.Value is bool) { oprop.IsEnabled = (bool)propertyViewModel.Value; } } } }
/// <summary> /// Updates the property header and tooltip /// </summary> /// <param name = "instanceType"> /// Type of the object being edited /// </param> /// <param name = "propertyViewModel"> /// The property viewmodel /// </param> private void LocalizePropertyHeader(Type instanceType, PropertyViewModel propertyViewModel) { propertyViewModel.Header = GetLocalizedString(instanceType, propertyViewModel.Name); propertyViewModel.ToolTip = GetLocalizedTooltip(instanceType, propertyViewModel.Name); // [DisplayName(..)] and [Description(...)] attributes overrides the localized strings var dna = AttributeHelper.GetFirstAttribute<DisplayNameAttribute>(propertyViewModel.Descriptor); var da = AttributeHelper.GetFirstAttribute<DescriptionAttribute>(propertyViewModel.Descriptor); if (dna != null) { propertyViewModel.Header = dna.DisplayName; } if (da != null) { propertyViewModel.ToolTip = da.Description; } }
/// <summary> /// The find data template. /// </summary> /// <param name="propertyViewModel"> /// The property view model. /// </param> /// <param name="element"> /// The element. /// </param> /// <returns> /// </returns> private DataTemplate FindDataTemplate(PropertyViewModel propertyViewModel, FrameworkElement element) { Type propertyType = propertyViewModel.PropertyType; if (Nullable.GetUnderlyingType(propertyType) != null) { propertyType = Nullable.GetUnderlyingType(propertyType); } // Try to find a template for the given type var template = TryToFindDataTemplate(element, propertyType); if (template != null) { return template; } // DataTemplates for enum types if (propertyType.BaseType == typeof(Enum)) { var rba = propertyViewModel.Descriptor.Attributes[typeof(RadioButtonsAttribute)] as RadioButtonsAttribute; int nValues = Enum.GetValues(propertyType).FilterOnBrowsableAttribute().Count; if (rba != null) { nValues = this.Owner.EnumAsRadioButtonsLimit; } if (nValues > this.Owner.EnumAsRadioButtonsLimit) { template = TryToFindDataTemplate(element, "ComboBoxEnumTemplate"); } else { template = TryToFindDataTemplate(element, "RadioButtonsEnumTemplate"); } if (template != null) { return template; } } // Try to find a template for the base type while (propertyType.BaseType != null) { propertyType = propertyType.BaseType; template = TryToFindDataTemplate(element, propertyType); if (template != null) { return template; } } // If the Slidable attribute is set, use the 'sliderBox' template if (propertyViewModel is SlidablePropertyViewModel) { template = TryToFindDataTemplate(element, "SliderBoxTemplate"); if (template != null) { return template; } } if (propertyViewModel is FilePathPropertyViewModel) { template = TryToFindDataTemplate(element, "FilePathTemplate"); if (template != null) { return template; } } if (propertyViewModel is DirectoryPathPropertyViewModel) { template = TryToFindDataTemplate(element, "DirectoryPathTemplate"); if (template != null) { return template; } } if (propertyViewModel is PasswordPropertyViewModel) { template = TryToFindDataTemplate(element, "PasswordTemplate"); if (template != null) { return template; } } // Use the default template (TextBox) if (propertyViewModel.AutoUpdateText) { template = TryToFindDataTemplate(element, "DefaultTemplateAutoUpdate"); } else { template = TryToFindDataTemplate(element, "DefaultTemplate"); } return template; }