gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:30 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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)到 Border 中的 root,然后无需指定 即可绑定(bind)ElementName 用于其中的每个绑定(bind),如下所示:

<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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com