C# 将UserControl属性绑定到窗口属性
我正在努力解决一些约束问题。 我有一个带有文本块的用户控件。TextBlock的文本绑定到属性。 在窗口中使用UserControl并使用一些文本设置属性时,一切都按预期进行。但当我将该属性绑定到窗口中的另一个属性时,什么也不会发生。 这是一个显示问题的示例: UserControl xaml:C# 将UserControl属性绑定到窗口属性,c#,wpf,binding,C#,Wpf,Binding,我正在努力解决一些约束问题。 我有一个带有文本块的用户控件。TextBlock的文本绑定到属性。 在窗口中使用UserControl并使用一些文本设置属性时,一切都按预期进行。但当我将该属性绑定到窗口中的另一个属性时,什么也不会发生。 这是一个显示问题的示例: UserControl xaml: <UserControl x:Class="TestBinding.UserControl1" xmlns="http://schemas.microsoft.com/winfx
<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}"/>
窗口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>
我希望在右下角看到的是“窗口默认文本”,但得到的是“控件默认文本”
感谢您的帮助您已经在UserControl构造函数中将
DataContext
显式设置为自身
public UserControl1()
{
this.DataContext = this; <-- HERE
InitializeComponent();
}
或 不要在UserControl构造函数中将DataContext设置为自身,并将UserControl中TextBlock的绑定更改为:
<TextBlock Text="{Binding SomeText,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=UserControl}}"/>
这样,它将自动继承windows dataContext。当您将
UserControl1.SomeText
设置为text时,它会起作用,因为绑定上下文并不重要,但当您使用binding并
public UserControl1()
{
this.DataContext = this;
....
}
您可以通过继承覆盖通常存在的DataContext
,并更改UserControl1
绑定的上下文。删除上面的行并按如下方式更改XAML:
<UserControl ... x:Name="myUserControl">
<TextBlock Text="{Binding ElementName=myUserControl, Path=SomeText}"/>
<TextBlock Text="{Binding SomeText,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType=UserControl}}"/>
public UserControl1()
{
this.DataContext = this;
....
}
<UserControl ... x:Name="myUserControl">
<TextBlock Text="{Binding ElementName=myUserControl, Path=SomeText}"/>