将UserControl绑定到它自己的dependencyProperty;不起作用
本文关键字:dependencyProperty 不起作用 自己的 它自己 UserControl 绑定 | 更新日期: 2023-09-27 18:25:44
我遇到了一个问题,当父对象设置为数据绑定时,我无法创建使用自定义对象属性的用户控件。
试图解释我在这里的意思是代码。自定义对象:
public class MyObj
{
public string Text { get; set; }
public MyObj(string text)
{
Text = text;
}
}
用户控制代码背后:
/// <summary>
/// Interaction logic for MyControl.xaml
/// </summary>
public partial class MyControl : UserControl
{
public static readonly DependencyProperty ObjectProperty =
DependencyProperty.Register("Object", typeof (MyObj), typeof (MyControl), new PropertyMetadata(default(MyObj)));
public MyObj Object
{
get { return (MyObj) GetValue(ObjectProperty); }
set { SetValue(ObjectProperty, value); }
}
public MyControl()
{
InitializeComponent();
}
}
用户控件XAML:
<UserControl x:Class="Test.MyControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<TextBlock Text="{Binding Object.Text}"/>
所以我所期望的是MyControl显示一个TextBlock,其中的文本显示MyObj.text中的任何字符串;
如果我在代码中添加控件,没有任何绑定,那么这就可以了。例如
MyControl myControl = new MyControl(){ Object = new MyObj("Hello World!") };
grid.Children.Add(myControl);
但是,如果我尝试使用数据绑定,这不会显示任何内容,下面是MainWindow的代码。
CodeBehind:
public partial class MainWindow : Window, INotifyPropertyChanged
{
private MyObj _Object;
public MyObj Object
{
get { return _Object; }
set
{
_Object = value;
OnPropertyChanged("Object");
}
}
public MainWindow()
{
InitializeComponent();
Object = new MyObj("HELLO");
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML:
有人能告诉我正确的方向吗?我想这与在UserControl上使用相对源绑定有关,但我不确定。
感谢
我个人从未在UserControl上使用过相对自绑定,所以我不确定它是否有效。您可以尝试设置UserControl
的x:Name
,并在绑定中使用它。
<UserControl x:Class="Test.MyControl"
...
x:Name="window">
<TextBlock Text="{Binding ElementName=window, Path=Object.Text}"/>
</UserControl>
请注意,如果数据绑定在运行时绑定失败,您还应该在"输出"窗口中看到相关的错误消息。
已经很久了。。但由于有一种新技术,我想把它贴在这里。
编译时间绑定:这是windows 10中引入的一种新型绑定。这种绑定对传统绑定有很多性能优势。
您不需要为页面或控件本身设置任何DataContext的额外好处是,您可以绑定到页面或控件中的任何内容
<UserControl x:Class="Test.MyControl"
...
x:Name="window">
<TextBlock Text="{x:Bind Object.Text}"/>
</UserControl>
但是这是否像你想象的那样完美。。不不像你猜的那样。这是有答案的。
编译的时间绑定默认设置为OneTime,而经典绑定则设置为OneWay。
因此,您需要显式地将模式设置为OneWay,以确保值始终更新。
<UserControl x:Class="Test.MyControl"
...
x:Name="window">
<TextBlock Text="{x:Bind Object.Text,Mode=OneWay}"/>
</UserControl>