首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >控件未立即使用INotifyPropertyChanged更新绑定属性

控件未立即使用INotifyPropertyChanged更新绑定属性
EN

Stack Overflow用户
提问于 2011-12-06 05:19:48
回答 1查看 7.3K关注 0票数 18

我有一些控件,它们不会更新它们绑定的对象的各自属性,直到焦点丢失。有类似的问题,接受的答案引用了DataSourceUpdateMode.OnPropertyChange被声明,我就是这样做的,但这种行为仍然存在。下面是一个示例实现。我会尽量做到彻底,但又要简洁。MyConfig类是通过我称为Configuration的单例类中的属性来访问的。

代码语言:javascript
复制
[Serializable]
public class MyConfig : INotifyPropertyChanged
{
    public enum MyEnum
    {
        Foo,
        Bar
    }

    public MyConfig()
    {
        MyProperty = MyEnum.Foo;
    }

    private MyEnum _MyProperty;
    public MyEnum MyProperty
    {
        get { return _MyProperty; }
        set { if (value != _MyProperty) { _MyProperty = value; OnPropertyChanged("MyProperty"); } }
    }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (string.IsNullOrEmpty(propertyName))
            throw new ArgumentNullException(propertyName);
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

public partial class ConfigForm : Form
{
    public ConfigForm()
    {
        InitializeComponent();
        MyComboBox.Items.AddRange(Enum.GetNames(typeof(MyConfig.MyEnum)));
    }

    private void ConfigForm_Load(object sender, EventArgs e)
    {
        MyComboBox.DataSource = Enum.GetValues(typeof(MyConfig.MyEnum));
        MyComboBox.DataBindings.Add("SelectedItem", Configuration.Instance.MyConfig, "MyProperty", false, DataSourceUpdateMode.OnPropertyChanged);
    }
}

考虑到下面的简短实现,我不确定我可以忽略什么来确保立即进行属性更改。我可以更改,在本例中,在ComboBox中从Foo更改为Bar,但除非从ComboBox中移除焦点,否则什么都不会更改。有谁有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-06 05:26:29

关于OnPropertyChanged,WinForms ComboBox是不可靠的。下面是一个旧项目中的一些代码,我用它来让OnPropertyChanged按照我期望的SelectedItem属性的方式工作。这适用于我的特定实例,但有时我通常很难让这个场景正常工作。祝好运!

代码语言:javascript
复制
/// <summary>
/// A modification of the standard <see cref="ComboBox"/> in which a data binding
/// on the SelectedItem property with the update mode set to DataSourceUpdateMode.OnPropertyChanged
/// actually updates when a selection is made in the combobox.
/// </summary>
public class BindableComboBox : ComboBox
{
    /// <summary>
    /// Raises the <see cref="E:System.Windows.Forms.ComboBox.SelectionChangeCommitted"/> event.
    /// </summary>
    /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param>
    protected override void OnSelectionChangeCommitted(EventArgs e)
    {
        base.OnSelectionChangeCommitted(e);

        var bindings = this.DataBindings
            .Cast<Binding>()
            .Where(x => 
                x.PropertyName == "SelectedItem" && 
                x.DataSourceUpdateMode == DataSourceUpdateMode.OnPropertyChanged);
        foreach (var binding in bindings)
        {
            // Force the binding to update from the new SelectedItem
            binding.WriteValue();

            // Force the Textbox to update from the binding
            binding.ReadValue();
        }
    }
}
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8392019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档