Wpf 绑定到自定义依赖项属性-再次

Wpf 绑定到自定义依赖项属性-再次,wpf,xaml,binding,dependency-properties,Wpf,Xaml,Binding,Dependency Properties,任务:实现有史以来最简单的依赖项属性,可在xaml中使用,如下所示: <uc:MyUserControl1 MyTextProperty="{Binding Text}"/> 这是我的主窗口.xaml <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat

任务:实现有史以来最简单的依赖项属性,可在xaml中使用,如下所示:

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>
这是我的主窗口.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:uc="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <uc:MyUserControl1 MyTextProperty="my text goes here"/>
        <Button Click="ButtonBase_OnClick" Content="click"/>
    </StackPanel>
</Window>
“初始文本”和“单击”均不显示。。。曾经因此,我的问题是如何正确地实现dept.属性以与一起使用

<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>

文本
属性位于主窗口的
DataContext
上,而不是用户控件的

因此,将此行
更改为:

<uc:MyUserControl1 MyTextProperty="{Binding Text, ElementName=MyMainWindow}"/>
如果不想命名窗口,可以使用RelativeSource FindAncestor绑定,如下所示:

<wpfApplication6:MyUserControl1 MyTextProperty="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>


在这两种情况下,您都要求在窗口的DataContext中查找名为“Text”的属性。

好的,非常感谢!通常我使用一个ViewModel,我在代码隐藏中设置它,比如'DataContext=newmyviewmodel(){Text=“foo”}。您能详细说明如何设置绑定吗?更新了我的答案,请记住,如果
Text
不是dependencProperty属性,MyViewModel应该实现
INotifyPropertyChanged
。再次感谢。您的更新将在可视化树中搜索窗口。但是如何绑定到DataContext,它不是控件,而是实现INotifyPropertyChanged并用作主窗口的DataContext的“普通”类AncestorType=MyViewModel“显然不起作用……我不确定我是否理解这个场景。”。。您有一个窗口,并将其DataContext设置为某个不实现INotifyPropertyChanged的常规类?或者您是说您不是在窗口中使用此控件?我在MyViewModel中实现了“Text”属性,它是一个常规类,并且实现了INotifyPropertyChanged。在主窗口的构造函数中,我执行“this.DataContext=new MyViewModel()”。当我在主窗口中使用我的控件时,如我在初始问题中所述,我想使用MyViewModel.Text属性进行绑定,而不是使用MainWindow.Text属性。为什么要回滚更改?我只是给c#代码块添加颜色,使其更易于阅读
public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
        Text = "Initial Text";
        DataContext = this;
    }
    private string _Text;
    public string Text
    {
        get { return _Text; }
        set
        {
            if (value != _Text)
            {
                _Text = value;
                NotifyPropertyChanged("Text");
            }
        }
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Text = "clicked";
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}
<uc:MyUserControl1 MyTextProperty="{Binding Text}"/>
<uc:MyUserControl1 MyTextProperty="{Binding Text, ElementName=MyMainWindow}"/>
<Window  Name="MyMainWindow" ..... />
<wpfApplication6:MyUserControl1 MyTextProperty="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>