C# DependencyProperty在Windows运行时,XAML值显示为空

C# DependencyProperty在Windows运行时,XAML值显示为空,c#,windows-runtime,dependency-properties,C#,Windows Runtime,Dependency Properties,我在XAML Windows RT应用程序中有一个简单的用户控件。DependencyProperty似乎设置得很好,代码中的断点显示“TwitterMessage”的目标属性在“IsLoaded”事件之后在运行时获得正确的对象。问题是,呈现XAML时,UserControl子控件中的绑定值为空。这就像忽略TwitterMessage属性的值一样。有什么想法吗?Intellisense似乎认为我做得对,因为它自动完成标记中的绑定 Usercontrol被赋予一个简单的调用,如下所示: <l

我在XAML Windows RT应用程序中有一个简单的用户控件。DependencyProperty似乎设置得很好,代码中的断点显示“TwitterMessage”的目标属性在“IsLoaded”事件之后在运行时获得正确的对象。问题是,呈现XAML时,UserControl子控件中的绑定值为空。这就像忽略TwitterMessage属性的值一样。有什么想法吗?Intellisense似乎认为我做得对,因为它自动完成标记中的绑定

Usercontrol被赋予一个简单的调用,如下所示:

<local:TwitterMessageUserControl TwitterMessage="{Binding Message}" Grid.Column="2" />

我很快重新创建了这个应用程序。运行应用程序时,我在调试输出中注意到以下错误:

错误:BindingExpression路径错误:在上找不到“消息”属性 “App4.TwitterMessageUserControl”。BindingExpression:Path='Message' DataItem='App4.TwitterMessageUserControl';目标元素是 'App4.TwitterMessageUserControl'(Name='root');目标属性为 “TwitterMessage”(键入“TweetMessage”)

问题是,当您执行
DataContext=this
在加载的TwitterMessageUserControl中,它将查找自身的
消息
属性,而不是视图中的DataContext集。注释掉这一行,它应该可以正常工作:

此外,如果要进一步简化
UserControl
XAML中的绑定,可以绑定到边框中的
root
,然后只需绑定,而不必为其中的每个绑定指定
ElementName
,如下所示:

<Border DataContext="{Binding ElementName=root}" Height="85" Width="400" BorderBrush="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" BorderThickness="1" >
    <StackPanel Background="{ThemeResource AppBarItemForegroundThemeBrush}" Orientation="Horizontal">
        <Image HorizontalAlignment="Left" Height="73" x:Name="Avatar" VerticalAlignment="Top" Width="73" Margin="10,5,0,0" Source="{Binding TwitterMessage.Tweet.AuthorAvatarUrl}"/>
        <StackPanel Margin="15,0,0,0">
            <TextBlock HorizontalAlignment="Left" x:Name="TweetText" TextWrapping="Wrap" Text="{Binding TwitterMessage.Tweet.Message}" VerticalAlignment="Top" Foreground="Black" Width="300" Margin="0,10,0,0" FontSize="12"/>
            <TextBlock TextWrapping="Wrap" Text="— @someone via Twitter" x:Name="TweetFromText" Foreground="Black" Margin="0,5,0,0"/>
        </StackPanel>
    </StackPanel>
</Border>


谢谢您的回复。我回家后会检查一下。您的意思是“注释掉”而不是“取消注释掉”DataContext=this;线路?另外,我应该澄清一下,TwitterMessage是从Message继承而来的;从技术上讲,我是将列表中的一项传递到绑定中。当我进入debug reflector时,我看到TwitterMessage类型很好,但是我想知道DependencyProperty是否需要是Message类型?同样,今晚我将尝试删除datacontext行,看看会发生什么。是的,删除“datacontext=this;”行。关于绑定,我需要查看作为视图的DataContext使用的模型。但是因为你说DependencyProperty TwitterMessage在运行时得到了正确的值,所以它应该可以正常工作。先生,你说得对。我很感激你的帮助,一旦我同意,我会尽快给你奖金。
public sealed partial class TwitterMessageUserControl : UserControl
{
    public static readonly DependencyProperty TwitterMessageProperty =
        DependencyProperty.Register("TwitterMessage", typeof(TweetMessage), typeof(TwitterMessageUserControl), new PropertyMetadata(null));

    public TweetMessage TwitterMessage
    {
        get { return (TweetMessage)GetValue(TwitterMessageProperty); }
        set { SetValue(TwitterMessageProperty, value); }
    }

    public TwitterMessageUserControl()
    {
        this.InitializeComponent();
        this.Loaded += TwitterMessageUserControl_Loaded;
    }

    void TwitterMessageUserControl_Loaded(object sender, RoutedEventArgs e)
    {
        DataContext = this;
    }
}
<Border DataContext="{Binding ElementName=root}" Height="85" Width="400" BorderBrush="{ThemeResource ApplicationSecondaryForegroundThemeBrush}" BorderThickness="1" >
    <StackPanel Background="{ThemeResource AppBarItemForegroundThemeBrush}" Orientation="Horizontal">
        <Image HorizontalAlignment="Left" Height="73" x:Name="Avatar" VerticalAlignment="Top" Width="73" Margin="10,5,0,0" Source="{Binding TwitterMessage.Tweet.AuthorAvatarUrl}"/>
        <StackPanel Margin="15,0,0,0">
            <TextBlock HorizontalAlignment="Left" x:Name="TweetText" TextWrapping="Wrap" Text="{Binding TwitterMessage.Tweet.Message}" VerticalAlignment="Top" Foreground="Black" Width="300" Margin="0,10,0,0" FontSize="12"/>
            <TextBlock TextWrapping="Wrap" Text="— @someone via Twitter" x:Name="TweetFromText" Foreground="Black" Margin="0,5,0,0"/>
        </StackPanel>
    </StackPanel>
</Border>