2014-02-19 82 views
0

我正在努力解决一些绑定问题。 我有一个用户控件与TextBlock。 TextBlock的文本绑定到一个属性。 在窗口中使用UserControl并使用某些文本设置属性时,一切都按预期工作。但是当我将该属性绑定到窗口中的另一个属性时,什么都不会发生。 这是一个例子,显示了问题:将UserControl属性绑定到Window属性

用户控件XAML:

<UserControl x:Class="TestBinding.UserControl1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<TextBlock Text="{Binding SomeText}"/> 

用户控件代码:

public partial class UserControl1 : UserControl 
{ 
    public static readonly DependencyProperty SomeTextProperty = DependencyProperty.Register("SomeText", typeof(string), typeof(UserControl1), new PropertyMetadata("Control Default Text")); 

    public string SomeText 
    { 
     get { return (string)this.GetValue(SomeTextProperty); } 
     set { this.SetValue(SomeTextProperty, value); } 
    } 

    public UserControl1() 
    { 
     this.DataContext = this; 

     InitializeComponent(); 
    } 
} 

窗口XAML:

<Window x:Class="TestBinding.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:TestBinding" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"/> 
     <ColumnDefinition Width="1*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <local:UserControl1 Grid.Row="0" Grid.Column="0"/> 
    <local:UserControl1 Grid.Row="1" Grid.Column="0" SomeText="Another Text" /> 
    <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding SomeText}"/> 
    <local:UserControl1 Grid.Row="1" Grid.Column="1" SomeText="{Binding SomeText}" /> 
</Grid> 

窗口代码:

public partial class MainWindow : Window 
{ 
    public static readonly DependencyProperty SomeTextProperty = DependencyProperty.Register("SomeText", typeof(string), typeof(MainWindow), new PropertyMetadata("Window Default Text")); 

    public string SomeText 
    { 
     get { return (string)this.GetValue(SomeTextProperty); } 
     set { this.SetValue(SomeTextProperty, value); } 
    } 

    public MainWindow() 
    { 
     this.DataContext = this; 

     InitializeComponent(); 
    } 
} 

我期望在右下角看到的是“窗口默认文本”但我得到的是“控制默认文本”。

感谢您的帮助

回答

0

当您设置UserControl1.SomeText到文本,因为再结合上下文并不重要,但如果您使用绑定和做

public UserControl1() 
{ 
    this.DataContext = this; 
    .... 
} 

您覆盖DataContext,通常会在那里通过继承和变革背景下的UserControl1绑定它的工作原理。删除以上行并更改XAML,如下所示:

<UserControl ... x:Name="myUserControl"> 
    <TextBlock Text="{Binding ElementName=myUserControl, Path=SomeText}"/> 
0

您已明确在用户控件构造函数中设置DataContext到自身。

public UserControl1() 
{ 
    this.DataContext = this; <-- HERE 

    InitializeComponent(); 
} 

所以默认绑定引擎为所有属性在它的DataContext即内本身将搜索。因此,找不到MainWindow.SomeText属性。

你必须明确地解决这样的:

<local:UserControl1 Grid.Row="1" Grid.Column="1" 
        SomeText="{Binding DataContext.SomeText, 
           RelativeSource={RelativeSource Mode=FindAncestor, 
                 AncestorType=Window}}" /> 

OR

不要在用户控件构造函数中设置的DataContext本身和用户控件改变TextBlock中的结合这一点:

<TextBlock Text="{Binding SomeText, 
       RelativeSource={RelativeSource Mode=FindAncestor, 
            AncestorType=UserControl}}"/> 

这样它呢会自动继承windows的dataContext。

相关问题