Silverlight: странная проблема с привязкой данных - PullRequest
2 голосов
/ 20 апреля 2010

Я использую диаграммы Visifire для отображения данных в приложении Windows Phone 7.Я создал диаграмму, которая была правильно связана со свойством зависимости.Это работало отлично.Я решил превратить диаграмму в пользовательский элемент управления, поскольку собирался использовать ее и в другом проекте с той же настройкой.Теперь моя привязка данных не работает, если я не связываю ее в коде, а не в XAML.

вот что у меня есть:

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

Спасибо

1 Ответ

2 голосов
/ 21 апреля 2010

Если я правильно вас понимаю, вы создали этот UserControl, чтобы вы могли размещать его экземпляры на различных страницах вашего приложения.

В этом случае вы, вероятно, дадите этим экземплярам имя. Это имя заменит имя «Root», которое изначально назначено в Xaml UserControl. Следовательно, привязка для ElementName=Root не удастся.

Обычно существует корневой элемент (обычно Grid) с именем «LayoutRoot». Следовательно, вместо того, чтобы полагаться на имя UserControl, которое может измениться, используйте «LayoutRoot», который по соглашению является элементом Content для UserControl. Вот так: -

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

Обратите внимание, что путь к свойствам теперь начинается с Parent, что переводит вас на UserControl без необходимости знать имя элемента управления пользователя.

...