You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
5.0 KiB
183 lines
5.0 KiB
/*************************************************************************************
|
|
|
|
Extended WPF Toolkit
|
|
|
|
Copyright (C) 2007-2013 Xceed Software Inc.
|
|
|
|
This program is provided to you under the terms of the Microsoft Public
|
|
License (Ms-PL) as published at http://wpftoolkit.codeplex.com/license
|
|
|
|
For more features, controls, and fast professional support,
|
|
pick up the Plus Edition at http://xceed.com/wpf_toolkit
|
|
|
|
Stay informed: follow @datagrid on Twitter or Like http://facebook.com/datagrids
|
|
|
|
***********************************************************************************/
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media;
|
|
using System.Windows.Data;
|
|
using System.Collections;
|
|
using Xceed.Wpf.Toolkit.Core.Utilities;
|
|
using System.Linq.Expressions;
|
|
using System.Diagnostics;
|
|
|
|
namespace Xceed.Wpf.Toolkit.PropertyGrid
|
|
{
|
|
[TemplatePart( Name = "content", Type = typeof( ContentControl ) )]
|
|
public class PropertyItem : CustomPropertyItem
|
|
{
|
|
#region Properties
|
|
|
|
#region IsReadOnly
|
|
|
|
/// <summary>
|
|
/// Identifies the IsReadOnly dependency property
|
|
/// </summary>
|
|
public static readonly DependencyProperty IsReadOnlyProperty =
|
|
DependencyProperty.Register( "IsReadOnly", typeof( bool ), typeof( PropertyItem ), new UIPropertyMetadata( false ) );
|
|
|
|
public bool IsReadOnly
|
|
{
|
|
get { return ( bool )GetValue( IsReadOnlyProperty ); }
|
|
set { SetValue( IsReadOnlyProperty, value ); }
|
|
}
|
|
|
|
#endregion //IsReadOnly
|
|
|
|
#region PropertyDescriptor
|
|
|
|
public PropertyDescriptor PropertyDescriptor
|
|
{
|
|
get;
|
|
internal set;
|
|
}
|
|
|
|
#endregion //PropertyDescriptor
|
|
|
|
#region PropertyName
|
|
|
|
public string PropertyName
|
|
{
|
|
get
|
|
{
|
|
return (this.DescriptorDefinition != null) ? this.DescriptorDefinition.PropertyName : null;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region PropertyType
|
|
|
|
public Type PropertyType
|
|
{
|
|
get
|
|
{
|
|
return ( PropertyDescriptor != null )
|
|
? PropertyDescriptor.PropertyType
|
|
: null;
|
|
}
|
|
}
|
|
|
|
#endregion //PropertyType
|
|
|
|
#region DescriptorDefinition
|
|
|
|
internal DescriptorPropertyDefinitionBase DescriptorDefinition
|
|
{
|
|
get;
|
|
private set;
|
|
}
|
|
|
|
#endregion DescriptorDefinition
|
|
|
|
#region Instance
|
|
|
|
public object Instance
|
|
{
|
|
get;
|
|
internal set;
|
|
}
|
|
|
|
#endregion //Instance
|
|
|
|
#endregion //Properties
|
|
|
|
#region Methods
|
|
|
|
protected override void OnIsExpandedChanged( bool oldValue, bool newValue )
|
|
{
|
|
if( newValue )
|
|
{
|
|
// This withholds the generation of all PropertyItem instances (recursively)
|
|
// until the PropertyItem is expanded.
|
|
var objectContainerHelper = ContainerHelper as ObjectContainerHelperBase;
|
|
if( objectContainerHelper != null )
|
|
{
|
|
objectContainerHelper.GenerateProperties();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override object OnCoerceValueChanged( object baseValue )
|
|
{
|
|
// Propagate error from DescriptorPropertyDefinitionBase to PropertyItem.Value
|
|
// to see the red error rectangle in the propertyGrid.
|
|
BindingExpression be = this.GetBindingExpression( PropertyItem.ValueProperty );
|
|
this.SetRedInvalidBorder( be );
|
|
return baseValue;
|
|
}
|
|
|
|
protected override void OnValueChanged( object oldValue, object newValue )
|
|
{
|
|
base.OnValueChanged( oldValue, newValue );
|
|
}
|
|
|
|
internal void SetRedInvalidBorder( BindingExpression be )
|
|
{
|
|
if( (be != null) && be.DataItem is DescriptorPropertyDefinitionBase )
|
|
{
|
|
DescriptorPropertyDefinitionBase descriptor = be.DataItem as DescriptorPropertyDefinitionBase;
|
|
if( Validation.GetHasError( descriptor ) )
|
|
{
|
|
ReadOnlyObservableCollection<ValidationError> errors = Validation.GetErrors( descriptor );
|
|
Validation.MarkInvalid( be, errors[ 0 ] );
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnDefinitionContainerHelperInvalidated( object sender, EventArgs e )
|
|
{
|
|
var helper = this.DescriptorDefinition.CreateContainerHelper( this );
|
|
this.ContainerHelper = helper;
|
|
if( this.IsExpanded )
|
|
{
|
|
helper.GenerateProperties();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Constructors
|
|
|
|
internal PropertyItem( DescriptorPropertyDefinitionBase definition )
|
|
: base( definition.IsPropertyGridCategorized, !definition.PropertyType.IsArray )
|
|
{
|
|
if( definition == null )
|
|
throw new ArgumentNullException( "definition" );
|
|
|
|
this.DescriptorDefinition = definition;
|
|
this.ContainerHelper = definition.CreateContainerHelper( this );
|
|
definition.ContainerHelperInvalidated += new EventHandler( OnDefinitionContainerHelperInvalidated );
|
|
}
|
|
|
|
#endregion //Constructors
|
|
}
|
|
}
|
|
|