WPF用户控件绑定问题
本文关键字:问题 绑定 控件 用户 WPF | 更新日期: 2023-09-27 18:01:06
我喜欢创建一个具有自己Header属性的UserControl。
public partial class SomeClass: UserControl, INotifyPropertyChanged
{
public SomeClass()
{
InitializeComponent();
}
private string header;
public string Header
{
get { return header; }
set
{
header = value;
OnPropertyChanged("Header");
}
}
protected void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
在UserContol xaml:中
Label Name="lbHeader" Grid.Column="0" Content="{Binding Path=Header}"
如果我设置值:AA2P.Header = "SomeHeeaderText";
,则label.Caption
不会改变。我该如何解决那个问题?
在Windows xaml:中
uc:SomeClass x:Name="AA2P"
如果我直接给(lbHeader.Content = header;)
而不是OnPropertyChanged("Header");
一个值来标记它的工作,那么为什么它不能与OnPropertyChanged
一起工作呢?
我需要将DataContext用于其他用途。我尝试使用依赖属性,但出现了问题。
public partial class tester : UserControl
{
public tester()
{
InitializeComponent();
}
public string Header
{
get { return (string)GetValue(MyDependencyProperty); }
set { SetValue(MyDependencyProperty, value); }
}
public static readonly DependencyProperty MyDependencyProperty =
DependencyProperty.Register("MyDependencyProperty", typeof(string), typeof(string));
}
<UserControl ... x:Name="mainControl">
<TextBlock Text="{Binding ElementName=mainControl, Path=MyDependencyProperty}"/>
</UserControl>
<Window ...>
<my:tester Header="SomeText" />
</Window>
它不起作用。我做错了什么?谢谢
最简单的方法是只使用对象的DataContext。一种方法是直接在构造函数中这样做:
public SomeClass()
{
InitializeComponent();
DataContext = this;
}
设置DataContext将指定应从何处提取新数据。在名为WPF基本数据绑定FAQ的文章中,有一些很棒的提示和信息。阅读它可以更好地了解DataContex的用途。它是WPF/C#中的一个重要组件。
由于问题的更新而更新。
根据我的理解,应该将DependencyProperty.Register
的第一个参数更改为要绑定到的属性的名称,此处为"Header"
,将第二个参数改为类的类型,此处为SomeClass
。这会给你留下:
public static readonly DependencyProperty MyDependencyProperty =
DependencyProperty.Register("Header", typeof(SomeClass), typeof(string));
但我很少使用依赖属性,所以我不确定这就是它,但它值得一试。。
如果您需要其他内容的Data上下文。您也可以在绑定中使用ElementName属性。
<UserControl
x:Class="MyControl.MyUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="mainControl">
<TextBlock Text="Binding ElementName=mainControl, Path=MyDependencyProperty}"/>
</UserControl>
[编辑]
我应该补充一些内容。将"Header"属性设置为依赖属性,这将使您的生活更加轻松。在UI控件中,您应该使属性几乎总是一个依赖属性,控件的每个设计器或用户都会感谢您。
UserControl本身需要稍后使用的DataContext。但是UserControl中的控件需要UserControl作为它们的DataContext,否则它们也将从以后的使用上下文继承DataContext。诀窍是将UserControl的子级的DataContext设置为UserControl的DataContext,这样它现在就可以使用UserControl的依赖属性了。
<UserControl x:Class="MyControl.MyUserControl">
<Grid DataContext="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType=UserControl,AncestorLevel=1}}">...</Grid>
</UserControl>
如果你这样做,网格的子级可以有简单的{Binding-dp的名称},而不需要额外的ElementName参数。