我的数据库有一个属性为 IsTrue 的表 Foo。我为此数据库创建了一个 Linq2SQL 类“myData.dbml”,并将生成的 Foo 类添加到我的数据源栏中。我有一个带有 ToggleButton 的简单 Winforms 窗口,它应该绑定到 IsTrue 的反面。
为了实现这一点,我尝试将属性 NotTrue 添加到 myData.dbml,但这会导致 SQLException、无效的行名“NotTrue”。我尝试将属性代码添加到 myData.cs,如下所示:
public bool NotTrue {
get {
return !this._IsTrue;
}
set {
if (this._IsTrue == value) {
this.OnIsTrueChanging(!value);
this.SendPropertyChanging();
this._IsTrue = !value;
this.SendPropertyChanged("IsTrue");
this.SendPropertyChanged("NotTrue");
this.OnIsTrueChanged();
}
}
}
但是,即使在添加时,将 Foo 添加到 Datasources 时属性也没有出现[Bindable(true)]
有效的是绑定到 IsTrue 并以此否定绑定:
private void InvertBoolBinding(ControlBindingsCollection collection,string property) {
foreach (Binding b in collection) {
if (b.PropertyName.Equals(property)) {
ConvertEventHandler invert = new ConvertEventHandler((sender, e) => { e.Value = !((bool)e.Value); });
b.Format += invert;
b.Parse += invert;
}
}
}
像这样调用:
InvertBoolBinding(lockToggleButton.DataBindings, "IsChecked");
虽然在我的主要项目中有大量的绑定,但这种方法很麻烦。似乎 Datasources 无法通过部分类连接属性。当我将该属性添加到 myData.designer.cs 时,它被找到了。但是这个类会定期再生,我的财产会丢失。
所以也许我需要一种完全不同的方法,或者也许有一种方法可以使部分类扩展工作。我希望你对此有所了解。谢谢!