Another post介绍了如何在XAML中访问代码隐藏变量。
但是,我想从XAML访问codebehind object 中的变量。名为 FeedData 的代码隐藏对象被声明为 FeedEntry 类型的依赖项属性。此类只是一个具有字符串和日期时间属性的容器类。
Codebehind的财产定义是这样的:
public FeedEntry FeedData
{
get { return (FeedEntry)GetValue(FeedDataProperty); }
set { SetValue(FeedDataProperty, value); }
}
public static readonly DependencyProperty FeedDataProperty =
DependencyProperty.Register("FeedData", typeof(FeedReaderDll.FeedEntry), typeof(FeedItemUserControl),
new FrameworkPropertyMetadata(new FeedEntry(){ Title="Hi!", Published=DateTime.Now }));
在XAML中,我这样做,这不起作用:
<UserControl x:Class="FeedPhysics.UserControls.FeedItemUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="40" Width="200"
Background="Blue"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
x:Name="xRoot">
<StackPanel>
<TextBlock Text="{Binding Title}" Foreground="White"/>
<TextBlock Text="{Binding Published}" Foreground="White"/>
</StackPanel>
</UserControl>
但是如果我在codebehind的构造函数中覆盖Window的datacontext设置,它将会起作用!像这样:
xRoot.DataContext = FeedData;
我理解为什么在codebehing中设置datacontext时它可以工作。但是我想找到一种方法来获取在代码隐藏中声明的对象中的变量。因为,一切都应该可以从XAML开始,对吗?
提前感谢您的回答。
答案 0 :(得分:0)
尝试将StackPanel的DataContext设置为FeedData对象:
<StackPanel DataContext="{Binding FeedData}">
...
这将强制StackPanel查看DependencyProperty,其中的所有元素都将作为FeedData的属性引用。
只要您将DataContext定义为视觉元素上方的逻辑树中某处的“FeedData”,它就会绑定到它的属性,它将起作用。