WPF by providing the undesirable DataContext, resulting in abnormal binding

Original: WPF undesirable due to set DataContext, resulting in abnormal binding

In MainWindow, create a background attribute BrushTest, and bind it to the interface

Copy the code
 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>
Copy the code
Copy the code
 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     }
Copy the code

And add a UserControl in the window, adding a BackgroundTest same attribute, and bind to the interface.

Copy the code
 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>
Copy the code
Copy the code
 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     }
Copy the code

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:

Copy the code
 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>
Copy the code

 

Guess you like

Origin www.cnblogs.com/lonelyxmas/p/11978454.html