私は拡張しようとしています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
設定されfalse
、BindingManagerBase
もnull
. したがって、入札はFormSettings
機能しません。
私は何が欠けていますか?
編集:
データバインディングの作成時にコンテキストメニューが表示されない可能性があることがわかりましたが、解決策はどれも機能しませんでした。
編集#2
FormSettings
バインド可能にしてその側にバインディングを追加すると、どのトリガーの 2 番目のインスタンスを作成しようとするまで、期待どおりに動作しContextMenuStrip
ますArgumentException
。This causes two bindings in the collection to bind to the same property.