在XAML中访问codebehind对象

时间:2009-08-07 13:09:05

标签: wpf xaml

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开始,对吗?

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

尝试将StackPanel的DataContext设置为FeedData对象:

<StackPanel DataContext="{Binding FeedData}">

...

这将强制StackPanel查看DependencyProperty,其中的所有元素都将作为FeedData的属性引用。

只要您将DataContext定义为视觉元素上方的逻辑树中某处的“FeedData”,它就会绑定到它的属性,它将起作用。