1

私は拡張しようとしていますContextMenuStrip(かなり頻繁に再利用しています)ので、バインドされFormSettingsます(後で設定が自動的に保存されます)。たとえば、何かをエクスポートするときにファイルを上書きするか追加するか。

フォーム設定:

internal sealed partial class FormSettings : global::System.Configuration.ApplicationSettingsBase, INotifyPropertyChanged
{

    private static FormSettings defaultInstance = ((FormSettings)(global::System.Configuration.ApplicationSettingsBase.Synchronized( new FormSettings() )));


    private void OnPropertyChanged( string propertyName )
    {
        this.OnPropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );
    }

    /// <summary>
    /// Default instance
    /// </summary>
    public static FormSettings Default
    {
        get { return defaultInstance; }
    }

    private FormSettings()
        : base( "column_settings" )
    {
    }

    ~FormSettings()
    {
        defaultInstance.Save();
    }

    [Bindable( true )]
    [global::System.Configuration.UserScopedSettingAttribute()]
    [global::System.Configuration.DefaultSettingValueAttribute( "False" )]
    public bool ExportCSVOverwrite
    {
        get { return (bool)this["ExportCSVOverwrite"]; }
        set
        {
            if (value != (bool)this["ExportCSVOverwrite"]) {
                this["ExportCSVOverwrite"] = value;
                OnPropertyChanged( "ExportCSVOverwrite" );
            }
        }
    }
}

私の拡張コンテキスト メニュー ストリップ:

public class MinimalExample : ContextMenuStrip, INotifyPropertyChanged
{
    bool _export_overwrite = false;

    /// <summary>
    /// Triggered when some property gets changed
    /// </summary>
    [Browsable( true )]
    [Category( "Action" )]
    public event PropertyChangedEventHandler PropertyChanged;

    [Browsable( true )]
    [Category( "Behavior" )]
    [Bindable( true )]
    public bool ExportOverWrite
    {
        get { return _export_overwrite; }
        set
        {
            if (value != _export_overwrite) {
                _export_overwrite = value;
                OnPropertyChanged( "ExportOverWrite" );
            }
        }
    }

    /// <summary>
    /// Triggered when property gets changed
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    virtual protected void OnPropertyChanged( object sender, PropertyChangedEventArgs e )
    {
        if (PropertyChanged != null) {
            PropertyChanged( sender, e );
        }
    }

    /// <summary>
    /// Triggered when property gets changed
    /// </summary>
    /// <param name="property_name"></param>
    protected void OnPropertyChanged( string property_name )
    {
        OnPropertyChanged( this, new PropertyChangedEventArgs( property_name ) );
    }

    public MinimalExample()
    {
        var tmp = DataBindings.Add( "ExportOverWrite", FormSettings.Default, "ExportCSVOverwrite", 
                           false, DataSourceUpdateMode.OnPropertyChanged, false );
        // Breakpoint here
    }
}

しかし、DataBindingsすべてのバインディングをデバッグしようとすると、 にIsBinding設定されfalseBindingManagerBasenull. したがって、入札はFormSettings機能しません。

私は何が欠けていますか?

編集:

データバインディングの作成時にコンテキストメニューが表示されない可能性があることがわかりましたが、解決策はどれも機能しませんでした。

編集#2

FormSettingsバインド可能にしてその側にバインディングを追加すると、どのトリガーの 2 番目のインスタンスを作成しようとするまで、期待どおりに動作しContextMenuStripますArgumentExceptionThis causes two bindings in the collection to bind to the same property.

4

1 に答える 1

0

この問題の回避策を見つけました (これによりDataBidings、すべてのコントロールがフォームに設定されたときに初期化されます)。

    protected override void OnOpened( EventArgs e )
    {
        base.OnOpened( e );
        DataBindings.Clear();
        InitializeDataBindings();
    }

それは機能しますが、それはただのクラッジです...誰かがより良い(より体系的な)解決策を持っているなら、私はうれしいです。

于 2013-09-23T16:59:56.857 に答える