Wpf 绑定到自定义依赖项属性-再次
任务:实现有史以来最简单的依赖项属性,可在xaml中使用,如下所示: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
<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}}"/>