【问题标题】:DependencyProperty in Windows Runtime, XAML values appear emptyWindows 运行时中的 DependencyProperty,XAML 值显示为空
【发布时间】:2014-06-05 02:37:41
【问题描述】:

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

给用户控件一个简单的调用,如下所示:

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

UserControl 标记如下:

<UserControl
x:Class="TwitterMessageUserControl"
...
x:Name="root">

<Border 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 ElementName=root, Path=TwitterMessage.Tweet.AuthorAvatarUrl}"/>
        <StackPanel Margin="15,0,0,0">
            <TextBlock HorizontalAlignment="Left" x:Name="TweetText" TextWrapping="Wrap" Text="{Binding ElementName=root, Path=TwitterMessage.Tweet.Message, Mode=OneWay}" 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>

代码隐藏如下:

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;
    }
}

【问题讨论】:

    标签: c# windows-runtime dependency-properties


    【解决方案1】:

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

    错误:BindingExpression 路径错误:找不到“消息”属性 'App4.TwitterMessageUserControl'。 BindingExpression:路径='消息' DataItem='App4.TwitterMessageUserControl';目标元素是 'App4.TwitterMessageUserControl'(名称='root');目标属性是 'TwitterMessage'(输入'TweetMessage')

    问题在于,当您在 TwitterMessageUserControl_Loaded 中执行 DataContext = this; 时,它会在其自身上查找 Message 属性,而不是在您的视图中设置的 DataContext。注释掉这一行,它应该可以正常工作:

    此外,如果您想进一步简化 UserControl XAML 中的绑定,您可以绑定到 Border 中的 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 继承的;从技术上讲,我正在将一个项目从 List 传递到绑定中。当我进入调试反射器时,我看到 TwitterMessage 类型很好,但我想知道 DependencyProperty 是否需要为 Message 类型?同样,今晚我将尝试删除 datacontext 行,看看会发生什么。
    • 是的,删除“DataContext = this;”行。关于绑定,我需要查看您用作视图的 DataContext 的模型。但是因为您说 DependencyProperty TwitterMessage 在运行时获得了正确的值,所以它应该可以正常工作。
    • 你先生是对的。感谢您的帮助,并会尽快奖励赏金。
    猜你喜欢
    • 2011-12-19
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多