C# WPF DependencyProperty始终为空

C# WPF DependencyProperty始终为空,c#,wpf,xaml,c#-4.0,C#,Wpf,Xaml,C# 4.0,我试图在用户控件上创建一个字符串属性,该属性可以在XAML中定义,而无需绑定。我的目标是像名字或任何其他财产,你可以直接输入自己 我的用户控件MediaStreamSource有一个名为Streams的StreamResource类的可观察集合。我将其内容添加到XAML中,如下所示: <local:MediaStreamSource Name="mediaSource"> <local:MediaStreamSource.Streams> <

我试图在用户控件上创建一个字符串属性,该属性可以在XAML中定义,而无需绑定。我的目标是像名字或任何其他财产,你可以直接输入自己

我的用户控件MediaStreamSource有一个名为Streams的StreamResource类的可观察集合。我将其内容添加到XAML中,如下所示:

<local:MediaStreamSource Name="mediaSource">
    <local:MediaStreamSource.Streams>
         <local:StreamResource ResourceName="wildlife.wmv" ResourceLocation="includes.wildlife.wmv"/>
         <local:StreamResource ResourceName="Yami_no_Prologue.mp3" ResourceLocation="includes.Yami_no_Prologue.mp3"/>
    </local:MediaStreamSource.Streams>
</local:MediaStreamSource>
我也尝试过INotifyPropertyChanged,但没有成功,已经被证实是错误的方法

更新:如果我做了下面的事情,它就可以正常工作了。只有通过XAML添加的项才为空

mediaSource.Streams.Add(new StreamResource()
{
    ResourceName = "Test.wmv",
    ResourceLocation = "includes.Wildlife.wmv"
});
有什么想法吗?任何帮助都将不胜感激

谢谢


-Matt

当您检查值时(在
ResourceStreamFile
的get访问器中),我认为代码也很好。这似乎只是取决于你如何检查它。可悲的是,我没有遵循。。。顺便说一下,我将ResourceStreamFile的get访问器中的部分移到了使用它的类中,它仍然为null。我更改了上面的代码以反映这些更改。DPs的声明是正确的。(顺便说一句,
INotifyPropertyChanged
机制不会像您在“第二次尝试”示例中编写的那样工作。也就是说,它们会工作并触发一个事件,但那里的代码更像是一个ViewModel,而不是带有XAML DPs的UserControl。)查看您的
MediaStreamsSource
中的
Streams
DP是如何声明的可能也会有所帮助。@Robberkins-感谢您的见解。我不认为InotifyProperty改变是一条路,但我绝望了。(lol)我更新了上面的代码,以显示MediaSourceStream类的相关部分。
public class StreamResource : UserControl
{
    public static readonly DependencyProperty ResourceNameProperty =
        DependencyProperty.Register("ResourceName", typeof(string), typeof(StreamResource), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public static readonly DependencyProperty ResourceLocationProperty =
        DependencyProperty.Register("ResourceLocation", typeof(string), typeof(StreamResource), new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

    public string ResourceName
    {
        get { return (string)GetValue(ResourceNameProperty); }
        set { SetValue(ResourceNameProperty, value); }
    }

    public string ResourceLocation
    {
        get { return (string)GetValue(ResourceLocationProperty); }
        set { SetValue(ResourceLocationProperty, value); }
    }
}
mediaSource.Streams.Add(new StreamResource()
{
    ResourceName = "Test.wmv",
    ResourceLocation = "includes.Wildlife.wmv"
});