【问题标题】:DataBinding within a UserControl not working at design time?用户控件中的数据绑定在设计时不起作用?
【发布时间】:2011-07-05 18:23:45
【问题描述】:

我有一个关于数据绑定和用户控件的小问题。

我构造 (使用 C# 2010) 一个用户控件,它基本上是 ComboBox 的包装器,它有一个自定义属性,当更改时,它会设置 ComboBox 的值。相反,如果 ComboBox 中的选定项发生更改,则属性的值也会更改。

现在,我可以通过捕获 ComboBox 上的“选定值已更改”事件并设置属性来做到这一点,并且我可以在属性设置器中设置 ComboBox 的选定值,但我想我也可以可以通过 DataBinding 做到这一点。

它几乎可以工作,但并不完全。

它在运行时有效,但在设计时无效,我想知道这是否可以轻松解决。

例如,如果在设计时,我选择了我的用户控件的实例,并从属性窗口中选择了我的控件的自定义属性并对其进行更改,则 ComboBox 不会反映更改。

任何指向我错过的东西的指针都将受到欢迎。显然,我可以设置 ComboBox 选择的值,但如果 DataBinding 能为我做这将很好。

谢谢

(这是我的用户控件。将一个放在表单上并使用 IDE 更改“位置”属性)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication13
{
  public partial class UserControl1 : UserControl, INotifyPropertyChanged
  {
     public event PropertyChangedEventHandler PropertyChanged;

     public enum enumPosition : byte
     {
        Unknown, First, Second, Third
     }

     public UserControl1()
     {
        InitializeComponent();

        var bindingList = new BindingList<KeyValuePair<enumPosition, String>>();

        foreach (enumPosition value in Enum.GetValues(typeof(enumPosition)))
        {
           bindingList.Add(new KeyValuePair<enumPosition, String>(value, value.ToString()));
        }

        this.comboBox1.DisplayMember = "Value";
        this.comboBox1.ValueMember = "Key";
        this.comboBox1.DataSource = bindingList;

        this.comboBox1.DataBindings.Add("SelectedValue", this, "Position", false, DataSourceUpdateMode.OnPropertyChanged);
     }

     private enumPosition _position = enumPosition.Unknown;

     [DefaultValue(typeof(enumPosition), "Unknown")]
     public enumPosition Position
     {
        get { return _position; }
        set
        {
           if (value != _position)
           {
              _position = value;
              this.OnPropertyChanged(new PropertyChangedEventArgs("Position"));
           }
        }
     }

     private void OnPropertyChanged(PropertyChangedEventArgs e)
     {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, e);
     }
  }
}

【问题讨论】:

  • 我删除了我的答案,因为当我尝试使用您的代码时,它会按照您希望的方式工作(当我在设计时更改属性时组合框会更新)。所以肯定有其他事情发生。
  • 嗨,这很奇怪,因为我刚刚这样做了:打开 VS,新建 Windows 项目,添加新用户控件,用上面替换代码,在用户控件上删除标准组合框控件,构建,删除用户窗体上的控件,更改“属性”窗口中的“位置”属性,显示的用户控件仍然显示“未知”。

标签: c# data-binding user-controls inotifypropertychanged


【解决方案1】:

对我也有用! 环境 - VS .Net 2008

我认为唯一的区别可能是“重新构建”应用程序而不仅仅是“构建”?

【讨论】:

  • 不。我只是做了一个“构建”,但它仍然不起作用。如果我关闭表单(在 IDE 中)然后重新打开它,果然它会显示“Position”属性的正确项目,但更改“Position”属性不会更改组合框中的选定项目。
猜你喜欢
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多