3

ここに画像の説明を入力

[TypeConverter(typeof(BrokerageConverter))]
[DescriptionAttribute("Brokerage Details")]
[PropertyGridInitialExpanded(true)]
[RefreshProperties(RefreshProperties.Repaint)]
public class Brokerage
{
    private Decimal _Amt = Decimal.Zero; private string _currency = "";

    public Brokerage() { }
    public Brokerage(Decimal broAmount, string broCurrency) { Amount = broAmount; Currency = broCurrency; }

    [ReadOnly(false)]
    public Decimal Amount 
    {
        get { return _Amt; }
        set { _Amt = value; }
    }

    [ReadOnly(true)]
    public string Currency
    {
        get { return _currency; }
        set { _currency = value; }
    }

    //public override string ToString() { return _Amt.ToString() + " - " + _currency; }
}

public class BrokerageConverter : ExpandableObjectConverter
{

    public override bool CanConvertTo(ITypeDescriptorContext context, System.Type destinationType)
    {
        if (destinationType == typeof(Brokerage))
            return true;

        return base.CanConvertTo(context, destinationType);
    }


    public override bool CanConvertFrom(ITypeDescriptorContext context, Type t)
    {
        if (t == typeof(string))
        {
            return true;
        }
        return base.CanConvertFrom(context, t);
    }

    // Overrides the ConvertFrom method of TypeConverter.
    public override object ConvertFrom(ITypeDescriptorContext context,CultureInfo culture, object value)
    {
        if (value is string)
        {
            string[] v = ((string)value).Split(new char[] { '-' });
            return new Brokerage(Decimal.Parse(v[0]), v[1]);
        }
        return base.ConvertFrom(context, culture, value);
    }
    // Overrides the ConvertTo method of TypeConverter.
    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == typeof(System.String) && value is Brokerage)
        {
            Brokerage b = (Brokerage)value;
            return b.Amount.ToString() + " - " + b.Currency.ToString();
        }
        return base.ConvertTo(context, culture, value, destinationType);
    }
}

金額を変更すると、Buyer Bro が自動的に更新されません。それを達成する方法は?追加情報を提供する必要がある場合はお知らせください

4

3 に答える 3

4

属性「[NotifyParentProperty(true)]」を追加すると、トリックが実行されます。

[ReadOnly(false)]
[NotifyParentProperty(true)]
public Decimal Amount 
{
    get { return _Amt; }
    set { _Amt = value; }
}

必ず追加してください

using System.ComponentModel;

これで、Amount を変更してこの別個のプロパティのフォーカスを失うと、親プロパティが自動的に更新されます。乾杯!

于 2015-06-18T08:11:32.563 に答える
3

私は過去に同じ問題を抱えていました。

[RefreshProperties(RefreshProperties.Repaint)]またはを配置してから、ターゲット オブジェクトRefreshProperties.Allに実装INotifyPropertyChangedしましたが、自動メカニズムを正しく機能させることができませんでした。

どうやら、私は一人では ありません

.Refresh()PropertyGridでメソッドの使用を終了しました。今では常に機能しています。

var b = new Brokerage(10, "EUR");
this.propertyGrid1.SelectedObject = b;

...

b.Amount = 20;
this.propertyGrid1.Refresh();
于 2013-03-06T13:42:03.680 に答える