C# WPF用户控件绑定问题

C# WPF用户控件绑定问题,c#,wpf,C#,Wpf,我喜欢用自己的头属性创建UserControl public partial class SomeClass: UserControl, INotifyPropertyChanged { public SomeClass() { InitializeComponent(); } private string header; public string Header { get { return 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;
}
在UserControl xaml中:

Label Name="lbHeader" Grid.Column="0" Content="{Binding Path=Header}"
如果我设置值:
AA2P.Header=“SomeHeeaderText”大于
标签。标题
不会更改。我怎样才能解决这个问题

在Windows xaml中:

uc:SomeClass x:Name="AA2P" 
如果我直接给label
(lbHeader.Content=header;)
而不是
OnPropertyChanged(“header”)它的工作方式,但是,为什么它不与
OnPropertyChanged
一起工作呢


我需要将DataContext用于其他内容。我尝试使用dependency属性,但出现了一些问题

公共部分类测试仪:UserControl
{
公共测试人员()
{
初始化组件();
}
公共字符串头
{
get{return(string)GetValue(MyDependencyProperty);}
set{SetValue(MyDependencyProperty,value);}
}
公共静态只读DependencyProperty MyDependencyProperty=
Register(“MyDependencyProperty”、typeof(string)、typeof(string));
}
它不起作用。我做错了什么?
谢谢

最简单的方法是只处理对象的DataContext。一种方法是直接在构造函数中执行,如下所示:

public SomeClass()
    {
        InitializeComponent();
        DataContext = this;
    }
设置DataContext将指定从何处获取新数据。在名为的文章中有一些很棒的提示和信息。阅读它可以更好地理解DataContex的用途。它是WPF/C#的一个重要组成部分


由于问题的更新而更新

据我所知,您应该将
dependencProperty.Register
的第一个参数更改为要绑定到的属性的名称,此处为
“Header”
,将第二个参数更改为类的类型,此处为
SomeClass
。这将给您留下:

public static readonly DependencyProperty MyDependencyProperty =
    DependencyProperty.Register("Header", typeof(SomeClass), typeof(string));

但是我很少使用依赖属性,所以我不确定这就是它,但是如果您需要其他内容的数据上下文,那么值得一试。

。您还可以在绑定中使用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中的控件需要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's name},而不需要额外的ElementName参数。

谢谢!我应该在三小时前问它:-)谢谢!我已经很累了,我忽略了它。抱歉更新了。我应该寻求更多:感谢您的建议,我将使用dependency属性。正如您所描述的,我需要使用DataContext,但不同的是什么呢。我已经完成了我的工作。你能看一下吗?谢谢我认为将更新作为一个新问题发布并不是一个坏主意,因为它大大改变了问题的范围。但也许我只是因为失去了被接受的答案而脾气暴躁。无论如何,我也试着回答了这个新问题,见下文。我更喜欢这种方法,而不是命名用户控件和使用ElementName绑定。但是,您会发现在自定义控件类中绑定到模板父级比在用户控件中更容易,尽管您会丢失设计时所见即所得编辑器。