Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 609|回复: 0

WPF 因设置不期望的DataContext,导致的绑定异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-8-30 10:00:31 | 显示全部楼层 |阅读模式

    在MainWindow中,创建一个背景属性BrushTest,并将其绑定至界面上UserControl的BackgroundTest属性

     1 <Window x:Class="WpfApp8.MainWindow"
     2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6         xmlns:local="clr-namespace:WpfApp8"
     7         mc:Ignorable="d"
     8         Title="MainWindow" Height="450" Width="800" x:Name="TheMainWindow">
     9     <Grid>
    10         <local:UserControl1 BackgroundTest="{Binding BrushTest}"/>
    11     </Grid>
    12 </Window>
     1     public partial class MainWindow : Window
     2     {
     3         public MainWindow()
     4         {
     5             InitializeComponent();
     6             BrushTest = Brushes.Red;
     7             this.DataContext = this;
     8         }
    10         public static readonly DependencyProperty BrushTestProperty = DependencyProperty.Register(
    11             "BrushTest", typeof(SolidColorBrush), typeof(MainWindow), new PropertyMetadata(default(SolidColorBrush)));
    13         public SolidColorBrush BrushTest
    14         {
    15             get { return (SolidColorBrush) GetValue(BrushTestProperty); }
    16             set { SetValue(BrushTestProperty, value); }
    17         }
    18     }

    UserControl,同样添加一个BackgroundTest属性,并将其绑定至界面。

     1 <UserControl x:Class="WpfApp8.UserControl1"
     2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     6              xmlns:local="clr-namespace:WpfApp8"
     7              mc:Ignorable="d" 
     8              d:DesignHeight="450" d:DesignWidth="800">
     9     <Grid Background="{Binding BackgroundTest}">
    10     </Grid>
    11 </UserControl>
     1     public partial class UserControl1 : UserControl
     2     {
     3         public UserControl1()
     4         {
     5             InitializeComponent();
     6             this.DataContext = this;
     7         }
     8         public static readonly DependencyProperty BackgroundTestProperty = DependencyProperty.Register(
     9             "BackgroundTest", typeof(SolidColorBrush), typeof(UserControl1), new PropertyMetadata(default(SolidColorBrush)));
    10         public SolidColorBrush BackgroundTest
    11         {
    12             get { return (SolidColorBrush) GetValue(BackgroundTestProperty); }
    13             set { SetValue(BackgroundTestProperty, value); }
    14         }
    15     }

    运行后,控制台输出绑定异常,背景设置并没有生效。

    System.Windows.Data Error: 40 : BindingExpression path error: 'BrushTest' property not found on 'object' ''UserControl1' (Name='')'.

    BindingExpression:Path=BrushTest; DataItem='UserControl1' (Name=''); target element is 'UserControl1' (Name=''); target property is 'BackgroundTest' (type 'SolidColorBrush')

    为何错了?

    因为UserControl设置了俩次DataContext,UserControl1内部设置的上下文覆盖了主窗口设置的上下文。

    窗口内<local:UserControl1 BackgroundTest="{Binding BrushTest}"/>绑定的值BrushTest,在UserControl下的上下文无法找到相关值,所以报错了

     

    此类绑定异常,一不小心还是很容易出现的。

    在窗口设置了DataContext时(自身或者ViewModel),子控件也设置DataContext。有趣的是,在Xaml编辑时,使用Reshaper链接到的是窗口所在的上下文属性。

    所以,子控件设置DataContext时,需要关注下是否有属性被引用绑定外界数据。

    建议子控件减少DataContext的使用,以上可以通过指定数据源进行绑定。比如:

     1 <UserControl x:Class="WpfApp8.UserControl1"
     2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     6              xmlns:local="clr-namespace:WpfApp8"
     7              mc:Ignorable="d" 
     8              d:DesignHeight="450" d:DesignWidth="800" x:Name="TheUserControl">
     9     <Grid Background="{Binding ElementName=TheUserControl,Path=BackgroundTest}">
    10     </Grid>
    11 </UserControl>

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 14:14 , Processed in 0.095950 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表