WPFMultiBinding失败。为什么?我有这个标记:在后面的代码中,我在window_loaded方法中有这一行:DataContext=uiManager;uiManager属于UIManager类型,它有两个公共属性,称为IsConnected和IsLoggedIn。此代码在启动时失败,因为Multibinding调用的Converter中的值数组未填充布尔值,而是具有值DependencyProperty.UnsetValue。当我使用下面的标记(并更改转换器的返回类型)时,它确实有效。在第一个示例中,似乎在后面的代码中通过DataContext设置的绑定失败了,但在第二个示例中有效。为什么?为了UIManager类下面的完整性:publicclassUIManager:IUIManager{#regionIUIManager的实现privateconststringIsLoggedInProperty="IsLoggedIn";私人布尔登录;私有只读对象loggedInLock=newobject();publicboolIsLoggedIn{get{lock(loggedInLock){returnloggedIn;}}set{lock(loggedInLock){if(value==loggedIn)return;登录=值;OnPropertyChanged(IsLoggedInProperty);}}}privatevoidOnPropertyChanged(stringproperty){if(PropertyChanged!=null)PropertyChanged(this,newPropertyChangedEventArgs(property));}privateconststringIsConnectedProperty="IsConnected";私人布尔已连接;私有对象isConnectedLock=newobject();publicboolIsConnected{get{lock(isConnectedLock){returnisConnected;}}set{lock(isConnectedLock){if(value==isConnected)return;已连接=值;OnPropertyChanged(IsConnectedProperty);}}}#endregion#regionINotifyPropertyChan的实现ged公共事件PropertyChangedEventHandlerPropertyChanged;#endregion}编辑:失败XAML的转换方法(它在转换为bool值[0]时失败:publicobjectConvert(object[]values,TypetargetType,objectparameter,CultureInfoculture){varis_connected=(bool)values[0];varis_loggedin=(bool)values[1];returnis_loggedin?is_connected?Colors.YellowGreen:Colors.Red:Colors.Gray;}对于工作XAML:publicobjectConvert(object[]values,TypetargetType,objectparameter,CultureInfoculture){varis_connected=(bool)values[0];varis_loggedin=(bool)values[1];returnis_loggedin?is_connected?Brushes.YellowGreen:Brushes.Red:Brushes.Gray;}问题无关使用MultiBinding或转换器DependencyProperty.UnsetValue指示绑定没有值。事实上,如果您在调试模式下运行,您可以在输出窗口中看到绑定错误:System.Windows.DataError:2:CannotfindgoverningFrameworkElementorFrameworkContentElementfortargetelement。绑定表达式:Path=IsConnected;数据项=空;目标元素是“SolidColorBrush”(HashCode=17654054);目标属性是“颜色”(类型“颜色”)System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。绑定表达式:路径=IsLoggedIn;数据项=空;目标元素是“SolidColorBrush”(HashCode=17654054);targetpropertyis'Color'(type'Color')所以让我们稍微简化标记并应用一些诊断:应用附加依赖属性PresentationTraceSources.TraceLevel产生更多输出:System.Windows.DataWarning:52:CreatedBindingExpression(hash=17654054)用于绑定(hash=44624228)System.Windows.Data警告:54:路径:'GroupColor'System.Windows.Data警告:56:BindingExpression(hash=17654054):默认模式解析为OneWaySystem.Windows.Data警告:57:绑定Expression(hash=17654054):默认更新触发器解析为PropertyChangedSystem.Windows.Data警告:58:BindingExpression(hash=17654054):附加到System.Windows.Media.SolidColorBrush.Color(hash=52727599)System.Windows.Data警告:60:BindingExpression(hash=17654054):使用框架导师System.Windows.Data警告:63:BindingExpression(hash=17654054):解析源System.Windows.Data警告:65:BindingExpression(hash=17654054):框架导师未找到System.Windows.Data警告:61:BindingExpression(哈希=17654054):解析源延迟System.Windows.Data警告:91:BindingExpression(哈希=17654054):从SolidColorBrush(哈希=52727599)System.Windows获取InheritanceContextChanged事件.Data警告:63:BindingExpression(哈希=17654054):解析源System.Windows.Data警告:66:BindingExpression(哈希=17654054):找到数据上下文元素:GroupBox(哈希=51393439)(确定)System.Windows.Data战争宁:67:BindingExpression(散列=17654054):DataContext为空System.Windows.Data警告:91:BindingExpression(散列=17654054):从SolidColorBrush(散列=52727599)获得InheritanceContextChanged事件System.Windows.Data警告:63:BindingExpression(hash=17654054):解析源System.Windows.Data警告:65:BindingExpression(hash=17654054):找不到框架导师System.Windows.Data警告:63:BindingExpression(hash=17654054):解析源System.Windows。数据警告:65:BindingExpression(哈希=17654054):未找到框架导师System.Windows.Data警告:63:BindingExpression(哈希=17654054):解析源(最后机会)System.Windows.Data警告:65:BindingExpression(哈希=17654054):未找到框架导师System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。绑定表达式:Path=GroupColor;数据项=空;目标元素是'SolidCcolorBrush'(HashCode=52727599);目标属性是“Color”(类型“Color”)我们看到绑定没有找到DataContext,当我更改Windows的构造函数以在初始化内容之前设置DataContext时绑定失败,绑定有效:publicWindow1(){数据上下文=...;初始化组件();这很奇怪,因为绑定在别处是什么并不重要。不确定为什么它不起作用,所以我只能提供解决方法。例如,使用绑定创建画笔作为资源(此资源也可以是GroupBox本地资源):我建议如果您的UIManager类是某种MVVMViewModel,请删除MultiBinding并在DataContext中进行一些预处理。我的理论。Color是一个结构(不能为null),因此SolidColorBrush.Color=null是错误的。WPF无法创建SolidColorBrush,您将得到一个异常。BorderBrush是对象(可以为null),所以GroupBox.BorderBrush=null是正常的。这个SolidColorBrush不是一个对象,而是一个FACTORY。它仅在需要时实例化,此时您已经附加了DataContext。只需2美分。顺便说一句,阅读我的文章,如果您需要一些奇怪的绑定或带有奇怪转换器的动画,它可能会有用。http://www.codeproject.com/KB/WPF/BindingHub.aspx出于这些原因,您可能需要考虑学习MVVM。此模式可帮助您抽象化模型和绑定,这样您就不必过分依赖DP-您可以简单地绑定到视图模型中的可通知属性。有几篇关于MVVM的优秀文章,所以我建议您先阅读KarlShifflett、JoshSmith、MarlonGrech和SachaBarber的著作。以上就是C#学习教程:WPFMultiBindingfailed。为什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
