【发布时间】:2011-01-21 14:34:25
【问题描述】:
假设您有一个窗口,上面有 20 个文本框,它们都绑定到不同的 BLL 类。与 wpf 绑定时,如何拦截从文本框传递到属性的值?我正在寻找一个通用的解决方案,而不是为每个属性都这样做。
我可以从 Binding 类继承,但是当数据从 uielement 传递到属性时,我可以在该类中监听一个事件吗?还是有更好的解决方案?
【问题讨论】:
假设您有一个窗口,上面有 20 个文本框,它们都绑定到不同的 BLL 类。与 wpf 绑定时,如何拦截从文本框传递到属性的值?我正在寻找一个通用的解决方案,而不是为每个属性都这样做。
我可以从 Binding 类继承,但是当数据从 uielement 传递到属性时,我可以在该类中监听一个事件吗?还是有更好的解决方案?
【问题讨论】:
Binding 有一个 Converter 属性,您可以将一个实现 IValueConverter 的类分配给该属性。如果您可以从绑定继承,也许您可以将 Converter 设置为该专业化并继续。
【讨论】:
我认为您正在寻找的解决方案是价值转换器。此 msdn 页面描述了如何执行此操作 -> http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion。
【讨论】:
我可能弄错了,但您是否尝试过使用转换器?这是一个不错的网站,你可以看看:
http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters
【讨论】:
我想对所有三个答案都进行投票,但我没有这方面的声誉。投票给这个,我会投票给你;)
感谢你们,我解决了我的问题!
这就是我所做的:
新建一个Binding类(继承自Binding),在构造函数中查看是否已经有Converter,如果没有则创建:
if (Converter == null) {
Converter = new GcBindingConverter();
}
if (Converter.GetType().IsAssignableFrom(typeof(GcBindingConverter))) {
((GcBindingConverter)Converter).SourceUpdated += SourceUpdatedHandler;
}
在需要此功能的每个表单上,将事件连接到事件处理程序,我已将处理程序放在我们的模型状态中:
static void WireDirtyBindings(DependencyObject element, ModelStateBase ModelState)
{
Binding bb = null;
// find bindings on elements:
if ((object.ReferenceEquals(element.GetType, typeof(TextBox)))) {
bb = BindingOperations.GetBinding(element, TextBox.TextProperty);
} else if ((object.ReferenceEquals(element.GetType, typeof(ComboBox)))) {
bb = BindingOperations.GetBinding(element, ComboBox.SelectedValueProperty);
// other objects...
}
if (bb != null) {
// wire eventhandler to event:
doWireHandler(bb, ModelState);
}
// Now, recurse through any child elements
if (element is FrameworkElement || element is FrameworkContentElement) {
foreach (object childElement in LogicalTreeHelper.GetChildren(element)) {
if (childElement is DependencyObject) {
WireDirtyBindings((DependencyObject)childElement, ModelState);
}
}
}
}
对于每个有大量数据输入的表单,我现在唯一需要写的是:
BaseBinding.WireDirtyBindings(this, _modelState);
5:在表单中,将 save changes 按钮的启用状态绑定到表示是否有任何更改的 modelstate 属性。我也可以为此使用一个接口,但因为我们已经有了类似模型状态的东西,所以这是一个放置它的好地方。
只需几行代码就可以很好地工作。现在我不必担心最终用户会进行大量更改而不保存。
【讨论】: