In MainWindow, create a background attribute BrushTest, and bind it to the interface
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 }
And add a UserControl in the window, adding a BackgroundTest same attribute, and bind to the interface.
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 }
After the run, the console output abnormal binding, set the background and does not take effect.
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')
Why wrong?
Because the two views provided UserControl DataContext, UserControl1 provided within the context of the main window covering context provided.
Window <local: UserControl1 BackgroundTest = "{ Binding BrushTest}" /> binding values BrushTest, can not be found in the context of the UserControl correlation value, given the
Such abnormal binding, accidentally or easily arise.
When the window is set DataContext (itself or ViewModel), child controls also set DataContext. Interestingly, in the Xaml editor, use Reshaper linked to the context properties window is located.
So, when the child controls set DataContext, whether there is need to focus on the next property is referenced external data binding.
It recommended reducing the use of child controls DataContext of the above can be bound by the specified data source. such as:
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>