WPF / Silverlight: данные, привязывающие текстовый текст к свойству программно - PullRequest
1 голос
/ 09 ноября 2009

У меня есть некоторый код, который устанавливает текстовый текст. Достаточно часто для текстового контекста должен быть задан некоторый базовый набор данных, такой как ObservableCollection, но иногда я хотел бы установить его на коллекцию, которая сама является свойством зависимости.

Это можно сделать в xaml, но это противоречит цели, которая заключается в совместном использовании кода пользовательского интерфейса между обоими сценариями.

Допустим, у меня есть свойство зависимости:

public static readonly DependencyProperty MyDataProperty = [whatever];

и в других местах у меня есть элемент управления, который ожидает от меня установки текста данных:

myGreatControl.DataContext = ???

Как настроить приведенный выше текст данных как ссылку на коллекцию, хранящуюся в свойстве зависимости?

Следующий вопрос кажется связанным: Silverlight: программно связывающие свойства элемента управления

Но я бы хотел связать не одно свойство с другим, а свойство с текстом данных. Преимущество этого в том, что мне не нужно знать тип, имя или даже цель кода привязки - любой FrameworkElement имеет текстовый текст, и у меня есть свойство (обновляемое), которое я хотел бы связать с ним.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2009

Приятно тратить время на выяснение того, как задать свой вопрос, потому что иногда ты понимаешь, что это ослепительно очевидно ...

Я сказал, что хотел бы не привязывать одно свойство к другому, а свойство к текстовому тексту - ну, получается, FrameworkElement.DataContext - это просто свойство зависимости; в частности, FrameworkElement.DataContextProperty.

Короче, я могу просто сделать:

Binding binding = new Binding("MyData") {
    Mode = BindingMode.OneWay,
    Source = this,
};
myGreatControl.SetBinding(FrameworkElement.DataContextProperty, binding);

Извините за вопрос - надеюсь, этот вопрос когда-нибудь спасет столь же сбитого с толку кодера.

1 голос
/ 09 ноября 2009

обычно, когда вы устанавливаете привязку, если вы не указали явно объект, с которым она связана, только путь к члену, он использует объект DataContext.

например ....

<TextBlock Text="{Binding MyProperty}"/>

привязывает текст к свойству «MyProperty» DataContext, а не к определенной коллекции. Вы можете увидеть это в ControlTemplates, как и для элементов ListBox. Пока ваш DataContext имеет свойство «MyProperty», все будет в порядке.

Вы также можете привязать напрямую к DataContext, как это ...

<TextBlock Text="{Binding}"/>

Я склонен делать это с родительским контейнером ...

<Grid DataContext="{Binding}">
    <TextBlock Text="{Binding MyProperty}"/>
</Grid>
...