![](/img/trans.png)
[英]WPF UserControl with ObservableCollection DependencyProperty not binding
[英]WPF Binding to UserControl Custom DependencyProperty
我有一个名为SongDescription的自定义UserControl:
<UserControl x:Class="DPTestAp.SongDescription" ...>
<Grid x:Name="LayoutRoot">
<DockPanel Height="50">
<TextBlock x:Name="title" Text="{Binding name}" Width="100" Height="30"/>
<TextBox x:Name="lyrics"/>
</DockPanel>
</Grid>
</UserControl>
我添加了DependencyProperty:
public partial class SongDescription : UserControl
{
public static readonly DependencyProperty SongProperty = DependencyProperty.Register("Song", typeof(Song), typeof(SongDescription));
public Song Song
{
get
{
return (Song)GetValue(SongProperty);
}
set
{
SetValue(SongProperty, value);
updateLyrics()
}
}
private void updateLyrics()
{
lyrics.Text = Song.lyrics;
}
public SongDescription()
{
InitializeComponent();
}
}
问题是:如何将某些东西绑定到这个SongProperty? 我在我的主窗口中使用SongDescription,如下所示:
<local:SongDescription x:Name="songDescription" Song="{Binding DataContext}"/>
我无法让我的TextBox 歌词显示歌词。 在主窗口中,我尝试将DataContext设置为songDescription,如下所示:
songDescription.DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" };
或像这样的窗口:
DataContext = new Song() { name="Home", lyrics="Hold on, to me as we go" };
我甚至尝试将Song作为资源并将其绑定到SongProperty,如下所示:
<Window.Resources>
<local:Song x:Key="res" name="Home" lyrics="Hold on, to me as we go"/>
</Window.Resources>
<Grid>
<local:SongDescription x:Name="songDescription" Song="{StaticResource res}"/>
</Grid>
什么都没有帮助。 TextBlock 标题将歌曲名称绑定。 但我无法调用updateLyrics()方法。 (在现实生活中这种方法比较复杂,所以我不能像名字那样使用Binding)。
谢谢!
是的,所以这是一个依赖属性的问题。 您永远不会将验证代码放在访问器方法(get / set)中,因为依赖项属性由WPF存储在它自己管理的表中。 这就是为什么你必须注册依赖属性,它实际上在这个表上创建条目用于存储与每个属性关联的值,当你使用'GetValue'/'SetValue'时,你正在更新这个表上的条目(顺便说一句与WPF如何能够管理数据绑定有关。
这样做的结果是,WPF可以(并且将)完全绕过您的属性访问器,因为它可以直接访问真实数据。 如果它可以直接转到数据,为什么要使用你的访问器。 相反,您需要实现'PropertyChanged'回调函数或一些WPF认可的验证方法,但永远不要在您的访问器中执行 。
看到:
除了sircodesalot的答案,你不受你的歌词文本框的约束。 此外,由于您所绑定的歌曲是一个类,因此您需要为要在“Path = Song.Lyrics”框中显示的属性完全指定路径。
另一件要考虑的是依赖属性; 默认情况下,您的模式将是单向的,因此,除非您更改文本字段,否则使文本字段可编辑是没有意义的。
第三,如果您正在使用MVVM,则只需将主窗口上下文设置为视图模型,并具有要绑定的匹配Song属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.