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>

它不起作用。我做错了什么?谢谢

WPF用户控件绑定问题

最简单的方法是只使用对象的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参数。