C#,VS-2010,winforms
通常我想用可绑定的MyProperty创建用户控件。但是我遇到了一些问题:当前行改变时数据行被修改。
您可以下载C#项目并亲自试用: test_bind.zip
为了简单起见,我确实遵循了:
所有标准步骤,没什么特别的
生成
按预期 - dgv中的行,textBox中的当前名称,单击网格中的不同行... 只有当我在文本框中修改文本时,我才会在断点处停止。
让我们修改程序,并将textBox绑定到不同的属性而不是Text - 让我们说标记。 设置DataSourceUpdateProperty“ OnValidation ”或“ OnPropertyChanged ”。
生成
现在当前行被修改。 !!!
当使用带有虚拟属性的UserControl
时,而不是textBox也是如此String MyProperty {set;得到; }
如何将用户控件中的自定义属性与与TextBox.Text相同的行为绑定?
注意:的 绑定属性本身不是问题。问题是:当我绑定到标准TextBox.Text属性时 - 所有Ok Wen我绑定到任何其他属性(Tag)或用户控件中的自定义属性 - 然后DATASOURCE总是成为当前行修改
答案 0 :(得分:2)
简短回答是:
绑定到simple属性时,声明为
[Bindable(true, BindingDirection.TwoWay)] // I need TwoWay
public String MyProp {set;get;}
然后数据源将更新当前位置更改。您可以将其视为Bug或功能......
改变行为 - 我需要魔术词。在控件中声明事件为
public event System.ComponentModel.PropertyChangedEventHandler MyPropChanged;
此名称很特别: “YourPropertyName”+“已更改” = YourPropertyNameChanged 其他的话不会是魔术。 一旦事件声明 - 数据源不会像以前那样每次更新......
现在我可以控制这个过程...
public void OnMyPropChanged(System.ComponentModel.PropertyChangedEventArgs e)
{
Binding bb = this.DataBindings[0] as Binding;
bb.WriteValue();
if (MyPropChanged != null) MyPropChanged(this, e);
}
private void TxtChanged(object sender, EventArgs e)
{
if (load) { return; }
_my_prop = Txt.Text; // ...
OnValueTwoChanged(new PropertyChangedEventArgs("MyProp"));
}
以下是包含更多详细信息的示例项目,其中我使用String属性创建用户控件 ValueTwo 它使用一些自定义逻辑分成两个不同的TextBox,并在用户更改文本时组合值和更新。