繁体   English   中英

WPF绑定到UserControl自定义DependencyProperty

[英]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认可的验证方法,但永远不要在您的访问器中执行

看到:

http://msdn.microsoft.com/en-us/library/ms752914.aspx

除了sircodesalot的答案,你不受你的歌词文本框的约束。 此外,由于您所绑定的歌曲是一个类,因此您需要为要在“Path = Song.Lyrics”框中显示的属性完全指定路径。

另一件要考虑的是依赖属性; 默认情况下,您的模式将是单向的,因此,除非您更改文本字段,否则使文本字段可编辑是没有意义的。

第三,如果您正在使用MVVM,则只需将主窗口上下文设置为视图模型,并具有要绑定的匹配Song属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM