В данной статье я хотел бы рассказать о механизмах связывания данных, которые я использовал для отображения новых задач, поступающих в базу данных.
Об основах привязки данных в WPF можно прочитать по ссылкам в конце поста. Тут же я опишу только то, что мне понадобилось реальном проекте. Итак, исходные данные:
- коллекция объектов, полученная из базы данных (List<Operations>)
- TaskbarIcon – графический элемент в котором надо отобразить данные
Для отображения моей коллекции я буду использовать UserControl, также можно использовать DataTemplate (об этом можно прочитать в по ссылке).
Сначала создаем объект <ResourceDictionary/> (подробнее про ресурсы) (словарь ресурсов), где и будет размещен наш TaskbarIcon.
Файл NotifyDictionary.xaml
<resourcedictionary
xmlns:local="clr-namespace:Wrapper"
xmlns:tb="http://www.hardcodet.net/taskbar"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<tb:taskbaricon iconsource="/Icons/Computers.ico"
tooltiptext="Wrapper v.0.1"
x:key="NotifIcon">
<tb:taskbaricon .traypopup="">
<local:usercontrol1>
</local:usercontrol1></tb:taskbaricon>
</tb:taskbaricon>
</resourcedictionary>
У объекта TaskbarIcon есть свойство TrayPopup, которое отображается при клике на иконку программы в трее. В это свойство мы и помещаем наш UserControl1. Далее нам надо подключить этот ResourceDictionary к приложению (файл App.xaml):
<application mc:ignorable="d"
startup="Application_Startup"
x:class="Wrapper.App"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<application .resources="">
<resourcedictionary>
<resourcedictionary .mergeddictionaries="">
"<resourcedictionary source="NotifyDictionary.xaml"></resourcedictionary>"
</resourcedictionary>
</resourcedictionary>
</application>
</application>
Так как нам нужна дополнительная корректировка привязок в коде в App.xaml дописываем строчку с запускаемым методом (Startup="Application_Startup")Файл App.xaml.cs:
private void Application_Startup(object sender, StartupEventArgs e)
{
var mainWindow = new MainWindow();
Current.MainWindow = mainWindow;
var viewModel = new MainViewModel(mainWindow);
mainWindow.DataContext = viewModel;
mainWindow.Tb = (TaskbarIcon)FindResource("NotifIcon");
if (mainWindow.Tb != null)
mainWindow.Tb.DataContext = viewModel;
}
Разберем поподробнее этот код: