2010-04-20 71 views
2

我正在使用Visifire图表在Windows Phone 7应用程序上显示数据。 我创建了正确绑定到依赖项属性的图表。它效果很好。我决定将图表制作成用户控件,因为我打算在另一个项目中使用它,并且使用相同的设置。现在我的数据绑定不起作用,除非我将它绑定在后面的代码而不是XAML中。Silverlight:奇怪的数据绑定问题

这里就是我有:

<UserControl ... x:Name="root"> 
... 
    <chart:DataSeries ... DataSource="{Binding ElementName=root, Path=Results}"> 
... 
</UserControl> 

和后面的代码:

public MyList Results 
{ 
    get { return (MyList)GetValue(ResultsProperty); } 
    set { SetValue(ResultsProperty, value); } 
} 

    // Using a DependencyProperty as the backing store for Results. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ResultsProperty = 
     DependencyProperty.Register("Results", typeof(MyList), typeof(MyChart), new PropertyMetadata(null)); 


public GoogleChart() 
{ 
    Loaded += delegate 
    { 
    // theChart.Series[0].DataSource = Results; 
    }; 
    Results = new GoogleResults(); 
    InitializeComponent(); 
} 

如果我取消对该行theChart.Series[0].DataSource = Results;它完美。但是如果我留下那条评论(就像我将图表移动到UserControl之前那样),它就不会绑定。 (顺便说一下:theChart是图表父项的x:name,所以第一个元素.Series[0]引用了图表)。

有谁知道为什么会发生这种情况?再次,它工作得很好,直到我将代码移到UserControl。

感谢

回答

2

如果我理解你正确地你已经创造了这个用户控件,这样你可以把它的实例到您的应用程序不同的页面。

在这种情况下,您可能会给这些实例一个名称。该名称将替换最初在UserControl的Xaml中分配的名称“Root”。因此,ElementName=Root的绑定将失败。

通常有一个名为“LayoutRoot”的根元素(通常是一个Grid)。因此,而不是依靠UserControl名称可以更改使用“LayoutRoot”,按照惯例是UserControl的内容元素。像这样: -

<chart:DataSeries ... DataSource="{Binding ElementName=LayoutRoot, Path=Parent.Results}"> 

注意属性路径现在开始与Parent这需要你到UserControl而无需实际需要知道用户控件的名字。

+0

太棒了。我不知道从其他类更改x:Name会改变名称。这很好。这是你给我的一个很好的建议。我认为它可能会比以往更方便。谢谢。 – Joel 2010-04-21 19:57:44