ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ Окончательное решение найдено в другом посте
Хотя я оценил предоставленное разъяснение, окончательное решение фактически было предоставлено другим решением, какссылка выше.Что бы я ни пытался, привязка через компонент «Имя элемента» не работала.Мне пришлось пойти по принципу «Относительная» иерархия вверх по сетке данных ...
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand,
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}"
CommandParameter="{Binding}"
Height="16" Width="16" HorizontalAlignment="Center" >
<Image Source="MyButtonImage.png" IsHitTestVisible="True"/>
</Button>
Надеюсь, что-то не слишком сложное в среде WPF / MVVM.Вот сценарий.
У меня есть окно (.xaml) и соответствующая модель представления (.cs).Форма отображается нормально со всеми привязками данных без проблем.(примечание: это НЕ делается с помощью какой-либо коммерческой "инфраструктуры")
Один из элементов управления, который находится в окне просмотра, представляет собой пользовательский элемент управления сеткой данных со всеми предварительно определенными столбцами, заголовками и содержимым, которые должны бытьотображается, когда отображается вид.Все это работает без проблем, даже если элемент управления не «напрямую» определен в файле .xaml главного окна, а просто помещен в форму как сам пользовательский элемент управления (который имеет свой собственный очевидный код .cs).
С указанным в главном окне «DataContext» указателем на модель представления и пользовательским элементом управления с сеткой данных
<DataGrid AutoGenerateColumns="False"
Name="dataMyStuff"
ItemsSource="{Binding Path=MyTablePropertyOnViewModel,
NotifyOnSourceUpdated=True,
NotifyOnTargetUpdated=True}" ... />
Теперь, что я ищу.В этой сетке данных у меня есть столбец с изображением в первом столбце.Когда я нажимаю на это изображение, я хочу напечатать отчет, относящийся к записи, представленной этой строкой (у нее есть значение PK, которое я использую).Итак, как мне сообщить событию «KeyUp» изображения перейти в обработчик событий View Model, поскольку именно там находятся данные, и некоторые другие методы, которые понадобятся мне для подготовки вызова к отчету.Часть представления сетки предназначена для косметического отображения пользователю, и, следовательно, нет «функциональных возможностей» непосредственно в этом элементе управления.
- EDIT - за ход выполнения ответов
Я настроил свою сетку данных в соответствии с комментариями Джоша и Рэйчел, однако что-то все еще кажется не совсем правильным ... Увидев, что кнопка использовала экземпляр "Command", я интерпретировал это как необходимый для присоединения кэкземпляр объекта интерфейса "ICommand" в моей модели представления.Итак, я создал экземпляр.Я знаю, что обработчик команд работает так же, как и для обычных вещей, таких как «Добавить», «Редактировать», «Сохранить», «Отмена», «Выход» и т. Д. Итак, у меня есть новый для этой цели печати.Для простоты я создал его как Always Execute, поэтому нет метода для обработки части элемента управления «CanExecute».Я установил «Команду» для кнопки практически на все итерации, о которых я не мог думать, но вот обновление того, что я вижу.
<UserControl>
<Data grid columns / template, etc to the button>
<DataTemplate>
<Button Name="btnPrintReport"
Command="{Binding DataContext.MyPrintCommand}" >
<Image Source="myPrintImage.png"/>
</Button>
</DataTemplate>
</Data grid columns, etc>
</UserControl>
В моем классе ViewModel (myICommandButtonHandler наследуетот ICommand)
private myICommandButtonHandler myPrintCommand;
public myICommandButtonHandler MyPrintCommand
{
get { if (myPrintCommand == null)
myPrintCommand = new myICommandButtonHandler(myPrint);
return myPrintCommand;
}
}
private void myPrint()
{
MessageBox.Show( "Doing the print job..." );
}
Теперь, что я вижу.Во время пошаговой инициализации всех элементов управления и тому подобное.Я нажимаю пункт меню, чтобы вызвать мое окно для отображения.Сначала создается экземпляр контроллера View Model.Затем он вызывает Window и передает контроллер View Model в качестве параметра, поэтому он немедленно устанавливается на уровне Window как «DataContext» окна.Затем главное окно переходит к вызову «InitializeComponents» и начинает создавать все другие встроенные элементы управления, включая этот отдельный класс, который содержит рассматриваемую сетку данных.В конструкторе этого пользовательского элемента управления (у которого есть сетка данных) еще не установлен «контекст данных», так как остальные элементы управления еще не были инициализированы, и я не знаю, почему / когда «привязки» явно получают »"подключен". Итак, похоже, что попытка связать с кнопкой команды сетки данных не удается.ОДНАКО во время выполнения фактические данные обновляются в сетке, поэтому я знаю, что многое работает.
Итак, сетка данных имеет свой "ItemsSource", установленный в свойство свойства "DataView"на модели представления, но привязка «кнопки», кажется, не видит обработчик «MyPrintCommand», который, как я думал, получит попадание ... и его действие заключается в том, чтобы просто отобразить окно сообщения (пока).