c# - Windows 运行时中的 DependencyProperty,XAML 值显示为空

标签 c# windows-runtime dependency-properties

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

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

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

用户控件标记如下:

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

最佳答案

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

Error: BindingExpression path error: 'Message' property not found on 'App4.TwitterMessageUserControl'. BindingExpression: Path='Message' DataItem='App4.TwitterMessageUserControl'; target element is 'App4.TwitterMessageUserControl' (Name='root'); target property is 'TwitterMessage' (type 'TweetMessage')

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

enter image description here

此外,如果您想在 UserControl XAML 中进一步简化绑定(bind),您可以绑定(bind)到边框中的 root,然后只需绑定(bind)而不指定 其中每个绑定(bind)的 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>

关于c# - Windows 运行时中的 DependencyProperty,XAML 值显示为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23190481/

相关文章:

c# - 自定义分页问题

c# - 启动 ConfigureServices AddMvc() 中的 KeyNotFoundException

windows-8 - Windows 8 应用程序 : How to pass a parameter on GoBack()?

C# 检测强调色更改 WinRT XAML

wpf - 将 WPF UserControl 绑定(bind)到 View 模型和隐藏代码

c# - linq orderby 中的过滤值

c# - SOAP 消息传递需要 HTTP Content-Type header ,但未找到

winapi - 下一代 Windows 的主要开发框架是什么?

c# - 使用反射将所有依赖属性重置回默认值?

c# - WPF:DependencyProperty 适用于 TextBlock 但不适用于自定义控件