2009-11-09 5 views
1

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

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

Скажем, у меня есть свойство зависимостей:

public static readonly DependencyProperty MyDataProperty = [whatever]; 

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

myGreatControl.DataContext = ??? 

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

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

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

ответ

2

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

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

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

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

К сожалению насчет вопроса - надеюсь, этот вопрос будет сохранить столь же смущенный кодировщик некоторое время.

1

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

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

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

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

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

<TextBlock Text="{Binding}"/> 

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

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

Я не совсем уверен, что вы получаете - если бы я это сделал, мне нужно было бы изменить xaml для каждого случая.Я пытаюсь в общем использовать определенный элемент управления и программно «подключаю его» к тому, что происходит в источнике - поэтому элемент управления не знает времени компиляции, действительно ли я привязываюсь к «MyProperty» или некоторому коду -для коллекции. Вот почему я хочу иметь возможность привязываться к коллекции напрямую или к другому имуществу. –

Смежные вопросы