Показаны сообщения с ярлыком WPF. Показать все сообщения
Показаны сообщения с ярлыком WPF. Показать все сообщения

среда, 21 августа 2013 г.

Data binding WPF

   В данной статье я хотел бы рассказать о механизмах связывания данных, которые я использовал для отображения новых задач, поступающих в базу данных. 
  Об основах привязки данных в 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;
        }

Разберем поподробнее этот код: