2009-10-15 2 views
3

Мне было интересно, сможете ли вы в WPF получить фактические экземпляры объектов datatemplate. Например, в следующей ситуации:Доступ к элементам внутри DataTemplate в WPF

<UserControl> 
    <UserControl.Resources> 
     <DataTemplate x:Key="MyTemplate"> 
      <CustomControl ></CustomControl> 
     </DataTemplate> 
    </UserControl.Resources> 

    <ListBox DataTemplate="{StaticResource MyTemplate}"></ListBox> 
</UserControl> 

Предположим, что CustomControl имеет CustomEvent и общественную CustomMethod. Я хочу получить доступ к этому событию и общедоступному методу в пользовательском элементе управления. Это возможно? Как я смогу это сделать? Заранее благодарю за любую помощь.

Приветствие,

Nilu

+0

доступ к ним откуда? – itowlson

+0

@itowlson: из UserControl, где размещается ListBox. Я хочу вызвать пользовательский метод (содержащийся в CustomControl) из usercontrol при срабатывании события. – Nilu

ответ

0

Вы можете создать объект, который придает CustomControl и взаимодействующий с ним.

Это Блогпост здесь иллюстрируются некоторые полезные понятиями, которые мы можем расширить на: ICommand for Silverlight with Attached Behaviors

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

Следуя схеме в ссылочного блоге вы бы в конечном итоге с:

<CustomControl 
    MyNamespace:CustomControlCommand.EventCommand= 
    "{Binding Path=CommandHandler}" /> 

Это даст вам доступ к событиям CustomControl, превращая их в команды.

5

Вы должны найти ContentPresenter удерживающий ListBox (при навигации по VisualTree), а затем использовать

myDataTemplate.FindName("myCustomControl", myListBox); 

Существует пример на MSDN: http://msdn.microsoft.com/en-us/library/bb613579.aspx.

+0

Пройдя через VisualTree, как чаще всего не то, что вы хотите, и лучшие решения существуют для этого случая –

+0

Я ответил на вопрос «[как] получить фактические экземпляры объектов datatemplate». В конце концов заголовок вопроса - «Доступ к элементам внутри DataTemplate в WPF». Насколько я вижу, это стандартный способ сделать это. – hwiechers

+0

Голосование этого ответа, так как это был ответ, который я искал, когда нашел этот вопрос. Это может быть не самый лучший способ, и это нормально, чтобы предлагать альтернативы, но это не повод для проголосовать за то, что явно является правильным ответом на заданный вопрос. – Niall

0

Я не вижу привязку данных ItemsSource в ListBox, поэтому я предполагаю, что вы ее оставили. Если вы привязаетесь к чему-то вроде ObservableCollection <>, то каждый элемент в ListBox будет иметь свой собственный класс ViewModel. У вас могут быть общедоступные методы для тех, которые вам нравятся.

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

Затем в каждой модели ViewModel есть экземпляр ICommand (или маршрутизированная команда, если это соответствует вашей цели). В UserControl у вас есть DataContext, который вы можете применить к типу ViewModel. Таким образом, обработчик событий может получить доступ к ViewModel и выполнить команды.

Вот Josh Smith's article on Routed Commands, которые вы можете найти интересные

В этой статье на Apps with MVVM architecture, Джош описал пользовательские ICommands

(Это псевдокод)

class ViewModelType { 
    public void DoSomething() { /* ... */ } 
    public ICommand DoSomethingCommand { get; set; } 
    public string Property { get; set; } 
} 

class CodeBehind { 
    public void EventHandler(object, args) { 
     (DataContext as ViewModelType).DoSomethingElseCommand.Execute(); 
    } 
} 
Смежные вопросы