protected override object GetValueCore(object component)
        {
            if (m_propertyDescriptor != null)
            {
                object value;

                try
                {
                    value = m_propertyDescriptor.GetValue(component);
                }
                catch (DataException)
                {
                    // We have to return null if the datarow is deleted from the DataTable.
                    // When the System.Data.DataRow have RowState == detached, it can be because it has been deleted
                    // or it being inserted, nothing special found to differentiate that 2 state.  So doing a try catch.
                    value = null;
                }

                CultureInfo converterCulture = this.ConverterCulture;

                if (converterCulture == null)
                {
                    converterCulture = CultureInfo.InvariantCulture;
                }

                return(this.GetBindingConverter(component).Convert(
                           value, this.DataType,
                           this.ConverterParameter, converterCulture));
            }

            if (m_bindingPathValueExtractorForRead == null)
            {
                CultureInfo converterCulture = this.ConverterCulture;

                if (converterCulture == null)
                {
                    converterCulture = CultureInfo.InvariantCulture;
                }

                PropertyPath propertyPath = null;

                if (!string.IsNullOrEmpty(this.ValuePath))
                {
                    propertyPath = new PropertyPath(this.ValuePath, BindingPathValueExtractor.EmptyObjectArray);
                }

                m_bindingPathValueExtractorForRead = new BindingPathValueExtractor(
                    this.ValueXPath, propertyPath, false,
                    this.DataType,
                    this.GetBindingConverter(component),
                    this.ConverterParameter, converterCulture);
            }

            return(m_bindingPathValueExtractorForRead.GetValueFromItem(component));
        }
        protected override void SetValueCore(object component, object value)
        {
            if (m_propertyDescriptor != null)
            {
                CultureInfo converterCulture = this.ConverterCulture;

                if (converterCulture == null)
                {
                    converterCulture = CultureInfo.InvariantCulture;
                }

                object convertedValue = this.GetBindingConverter(component).ConvertBack(
                    value,
                    m_propertyDescriptor.PropertyType,
                    this.ConverterParameter,
                    converterCulture);

                m_propertyDescriptor.SetValue(component, convertedValue);
            }
            else
            {
                if (m_bindingPathValueExtractorForWrite == null)
                {
                    CultureInfo converterCulture = this.ConverterCulture;

                    if (converterCulture == null)
                    {
                        converterCulture = CultureInfo.InvariantCulture;
                    }

                    PropertyPath propertyPath = null;

                    if (!string.IsNullOrEmpty(this.ValuePath))
                    {
                        propertyPath = new PropertyPath(this.ValuePath, BindingPathValueExtractor.EmptyObjectArray);
                    }

                    m_bindingPathValueExtractorForWrite = new BindingPathValueExtractor(
                        this.ValueXPath, propertyPath, true,
                        this.DataType,
                        this.GetBindingConverter(component), this.ConverterParameter, converterCulture);
                }

                m_bindingPathValueExtractorForWrite.SetValueToItem(component, value);
            }

            base.SetValueCore(component, value);
        }
    protected override void SetValueCore( object component, object value )
    {
      if( m_propertyDescriptor != null )
      {
        CultureInfo converterCulture = this.ConverterCulture;

        if( converterCulture == null )
          converterCulture = CultureInfo.InvariantCulture;

        object convertedValue = this.GetBindingConverter( component ).ConvertBack(
          value,
          m_propertyDescriptor.PropertyType,
          this.ConverterParameter,
          converterCulture );

        m_propertyDescriptor.SetValue( component, convertedValue );
      }
      else
      {
        if( m_bindingPathValueExtractorForWrite == null )
        {
          CultureInfo converterCulture = this.ConverterCulture;

          if( converterCulture == null )
            converterCulture = CultureInfo.InvariantCulture;

          PropertyPath propertyPath = null;

          if( !string.IsNullOrEmpty( this.ValuePath ) )
            propertyPath = new PropertyPath( this.ValuePath, BindingPathValueExtractor.EmptyObjectArray );

          m_bindingPathValueExtractorForWrite = new BindingPathValueExtractor(
            this.ValueXPath, propertyPath, true,
            this.DataType,
            this.GetBindingConverter( component ), this.ConverterParameter, converterCulture );
        }

        m_bindingPathValueExtractorForWrite.SetValueToItem( component, value );
      }

      base.SetValueCore( component, value );
    }
    protected override object GetValueCore( object component )
    {
      if( m_propertyDescriptor != null )
      {
        object value;

        try
        {
          value = m_propertyDescriptor.GetValue( component );
        }
        catch( DataException )
        {
          // We have to return null if the datarow is deleted from the DataTable.
          // When the System.Data.DataRow have RowState == detached, it can be because it has been deleted
          // or it being inserted, nothing special found to differentiate that 2 state.  So doing a try catch.
          value = null;
        }

        CultureInfo converterCulture = this.ConverterCulture;

        if( converterCulture == null )
          converterCulture = CultureInfo.InvariantCulture;

        return this.GetBindingConverter( component ).Convert(
          value, this.DataType,
          this.ConverterParameter, converterCulture );
      }

      if( m_bindingPathValueExtractorForRead == null )
      {
        CultureInfo converterCulture = this.ConverterCulture;

        if( converterCulture == null )
          converterCulture = CultureInfo.InvariantCulture;

        PropertyPath propertyPath = null;

        if( !string.IsNullOrEmpty( this.ValuePath ) )
          propertyPath = new PropertyPath( this.ValuePath, BindingPathValueExtractor.EmptyObjectArray );

        m_bindingPathValueExtractorForRead = new BindingPathValueExtractor(
          this.ValueXPath, propertyPath, false,
          this.DataType,
          this.GetBindingConverter( component ),
          this.ConverterParameter, converterCulture );
      }

      return m_bindingPathValueExtractorForRead.GetValueFromItem( component );
    }