Как привязать свойство зависимости к чему-либо в XAML

(Использование Silverlight 4.0 и VS 2010)
Итак, я создал свойство с именем Rank в моем файле C #. Как мне теперь связать это с элементом управления в xaml-файле UserControl?

Мой код: (TopicListItem.xaml.cs)

    #region Rank (DependencyProperty)

    /// <summary> 
    /// Rank 
    /// </summary> 
    public int Rank
    {
        get { return (int)GetValue(RankProperty); }
        set { SetValue(RankProperty, value); }
    }
    public static readonly DependencyProperty RankProperty =
        DependencyProperty.Register("Rank", typeof(int), typeof(TopicListItem),
        new PropertyMetadata(0, new PropertyChangedCallback(OnRankChanged)));

    private static void OnRankChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ((TopicListItem)d).OnRankChanged(e);
    }

    protected virtual void OnRankChanged(DependencyPropertyChangedEventArgs e)
    {

    }

    #endregion Rank (DependencyProperty)

Я хочу сделать это в моем TopicListItem.xaml

...
<Textblock Text="{TemplateBinding Rank}"/>
...

но на самом деле это не работает.


person JeroenEijkhof    schedule 09.07.2010    source источник


Ответы (4)


Если вам нужно привязать свойство в xaml Usercontrol к свойству, предоставляемому тем же UserControl, используйте следующий шаблон: -

<TextBlock Text="{Binding Parent.Rank, ElementName=LayoutRoot}" />

Обратите внимание, что это предполагает, что корневому элементу содержимого внутри UserControl было присвоено имя «LayoutRoot».

person AnthonyWJones    schedule 10.07.2010
comment
Спасибо, Энтони ... это действительно сработало, в то время как Акаш нет, поэтому читатели, пожалуйста, ознакомьтесь с комментариями к ответу Акаши, чтобы объяснить, почему его не удалось. Этот UserControl на самом деле был дочерним элементом и частью списка ... еще раз спасибо :) - person JeroenEijkhof; 13.07.2010
comment
Энтони, я хотел бы узнать больше об этом и, в частности, о том, какая логика / причина стоят за некоторыми вещами, такими как Parent. и ElementName= ... спасибо! - person JeroenEijkhof; 13.07.2010
comment
Фактически для этого конкретного элемента управления он работал без использования Parent. в пути. Все равно нашла. - person JeroenEijkhof; 13.07.2010

<UserControl xmlns..... 
    x:Name="myUserControl">

....

<Textblock Text="{Binding Rank,ElementName=myUserControl}"/>

....

</UserControl>

Вам нужно установить ElementName на x: Name UserControl, если x: Name пусто, определите его.

person Akash Kava    schedule 09.07.2010
comment
Это отлично работает, если UserControl когда-либо используется только как RootVisual или навигационная страница. Однако, если он используется в качестве дочернего элемента управления, этот подход, скорее всего, потерпит неудачу, поскольку имя UserControl может быть повторно назначено внешним xaml. - person AnthonyWJones; 10.07.2010
comment
Я не замечал таких вещей, иначе можно было бы указать относительный источник как self. - person Akash Kava; 11.07.2010
comment
Это не сработало, поскольку имя должно быть в корневом элементе UIElement в UserControl, а не в самом UserControl. - person JeroenEijkhof; 13.07.2010
comment
При дальнейших исследованиях и экспериментах это действительно сработало. Но не при использовании синтаксиса пути Parent.. Итак, похоже, что ElementName устанавливает, где должен начинаться путь .... - person JeroenEijkhof; 13.07.2010

Вам нужно использовать Binding, а не TemplateBinding,

Также вы можете узнать, как сообщать вам об ошибках привязки - очень полезное поведение по умолчанию в WPF заставляет вас гадать о проблемах привязки, но вы действительно можете получить много полезной информации, если включите его.

person Will Dean    schedule 09.07.2010
comment
Спасибо за подсказку. Как я могу это сделать? - person JeroenEijkhof; 13.07.2010
comment
В VS2010 есть опции в Инструменты - ›Параметры -› Отладка - ›Окно вывода. Не уверен насчет более ранних версий, но вы можете включить фитиль в коде с помощью PresentationTraceSources - это, вероятно, хороший термин для Google. - person Will Dean; 13.07.2010

наверное <Textblock Text="{Binding Rank}"/>.

person Femaref    schedule 09.07.2010