2011-02-28 69 views
3

我有一个关于数据绑定和用户控件的小问题。UserControl内的DataBinding在设计时不起作用?

我构建了(使用C#2010)一个基本上是ComboBox的包装的用户控件,它有一个自定义属性,当它改变时,它设置ComboBox的值。相反,如果组合框中的选定项目发生更改,则该属性的值会更改。现在,我可以通过捕获组合框上的“selected value changed”事件并设置属性,并且我可以在属性设置器中设置组合框的选定值,但我推测我可能会也可以用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); 
    } 
    } 
} 
+0

我删除了我的答案,因为当我尝试使用您的代码时,它将它转换为您想要的方式工作(在设计时更改属性时更新了组合框)。所以一定还有其他的事情要做。 – 2011-03-01 07:18:20

+0

嗨,这很奇怪,因为我刚刚做到这一点:打开VS,新的Windows项目,添加新的用户控件,替换上面的代码,在用户控件上放置std组合框控件,在窗体上创建,删除用户控件,更改“位置“属性”窗口中,显示的用户控件仍显示“未知”。 – 2011-03-01 08:37:34

回答

0

对我的作品! 环境 - VS .Net 2008

唯一的区别我认为可能是'重建'应用程序,而不是'建立'?

+0

没有。我只是做了一个“构建”,但它仍然行不通。如果我关闭表单(在IDE中)然后重新打开它,果然它会显示“位置”属性的正确项目,但更改“位置”属性不会更改组合框中的选定项目。 – 2011-06-20 09:48:52