Как получить доступ к текстовому тексту элемента управления silverlight в коде - PullRequest
4 голосов
/ 11 ноября 2010

У меня есть управление Silverlight, которое я создаю так:

<MyControls:SomeControl DataContext="{Binding}" />

В коде этого файла, как я могу получить доступ к этому текстовому тексту? this.DataContext равен нулю.

Редактировать (подробнее):

Я создаю расширение для существующего приложения Silverlight. Моя точка зрения на интеграцию с приложением выглядит следующим образом:

<DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp">
    <MyControls:SomeControl DataContext="{Binding}" />
</DataTemplate>

Внутри моего контроля я могу связываться со свойствами вот так:

<Hyperlink NavigateUri="{Binding Path=UriWithSlug}">

И все это прекрасно работает. Однако для определенных функций (в частности, мне нужно использовать элемент управления WebBrowser и метод NavigateToString ()), мне нужно получить доступ к свойствам из DataContext.

В основном в коде, мне нужно сделать что-то с эффектом:

myWebBrowser.NavigateToString(DataContext.MyHTMLStringProperty);

Ответы [ 4 ]

3 голосов
/ 11 ноября 2010

Вам не нужно DataContext={Binding}, поскольку это равносильно DataContext = DataContext.

Однако вам не хватает информации о типе.Привязки используют отражение для разрешения путей к свойствам, однако при выделении кода вам нужно будет знать тип объекта, возвращаемого DataContext.

Если вы можете быть в этом уверены, тогда это будет просто: -

myWebBrowser.NavigateToString(((MyType)DataContext).MyHTMLString); 

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

Используйте систему привязки, чтобы сделать рефлексию для вас

Альтернатива, если вы не можете знать тип, только имя свойства: -

public string HTMLString
{
   get { return (string)GetValue(HTMLStringProperty); }
   set { SetValue(HTMLStringProperty, value); }
}
public static DependencyProperty HTMLStringPropery =
   DependencyProperty.Register(
      "HTMLString",
      typeof(string),
      typeof(SomeControl),
      null);

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

SetBinding(HTMLStringProperty, new Binding("MyHTMLString"));

При этом ваш код будет выглядеть так: -

myWebBrowser.NavigateToString(HTMLString);

В качестве альтернативы вы можете сделать связывание этого нового свойства вашего контроля ответственностью Xaml: -

<DataTemplate x:Key="AnImportantIdentifierUsedByTheHostApp">                  
    <MyControls:SomeControl HTMLString="{Binding MyHTMLString}" />                  
</DataTemplate> 
1 голос
/ 30 ноября 2010

Ответ, конечно, очень прямой, и я уверен, что все, вероятно, предполагали, что я делал ...

DataContext недоступен, пока не сработает событие Loaded элемента управления.

public MyUserControl() {
    var dc = this.DataContext // DataContext is null here in the ctor.

    this.Loaded += (s, e) => {
        var sc2 = this.DataContext // Loaded event fires, DataContext exists!
    };
}

Опять же, я уверен, что это, вероятно, очевидно для многих разработчиков SL, но это полностью сбило меня с толку.

0 голосов
/ 12 ноября 2010
var mytype = this.DataContext as MyType;

В качестве меры предосторожности, потом проверю на ноль:

if (mytype!=null)
{
    // do something here
    myWebBrowser.NavigateToString(mytype.MyHTMLStringProperty);
}
0 голосов
/ 11 ноября 2010

Хорошо, теперь немного больше смысла. Соответственно меняя ответ ...

Как правило, вам никогда не понадобится DataContext = {Binding}. DataContext элемента устанавливается (для каждого элемента) родительским элементом управления. В большинстве элементов управления типа списка, генерируемых из записей в ItemsSource.

  1. Можете ли вы удалить DataContext = {Binding} и убедиться, что он все еще работает?
  2. Если фактический дочерний элемент управления не имеет явного значения DataContext, то для получения DataContext родительского элемента управления вам, возможно, придется перейти вверх по визуальному дереву (пока вы не найдете ненулевой DataContext).

Можете ли вы предоставить больше кода / xaml, который мы можем видеть выше в контексте?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...