xaml - Binding/DataContext Issue with ItemSource in WPF using MVVM -


i have viewmodel window, inside window there many usercontrols have made. these work fine , bindings , datacontexts each set appropriately; apart one...

in mainwindowview xaml have

<controls:logviewerview horizontalalignment="stretch"                         verticalalignment="stretch"                         datacontext="{binding logviewerviewmodel}"/> 

and in mainwindowviewmodel have

public logviewerviewmodel logviewerviewmodel { get; set; } 

the logviewerview

<usercontrol x:class="gambitframework.utilities.controls.views.logviewerview"              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"               xmlns:d="http://schemas.microsoft.com/expression/blend/2008"               xmlns:caliburn="http://www.caliburnproject.org"              xmlns:models="clr-namespace:gambitframework.utilities.models"              mc:ignorable="d"               d:designheight="300"               d:designwidth="200">     <usercontrol.resources>         <resourcedictionary>             <resourcedictionary.mergeddictionaries>                 <resourcedictionary source="../../resources/styles.xaml"/>             </resourcedictionary.mergeddictionaries>         </resourcedictionary>        </usercontrol.resources>     <dockpanel>         <itemscontrol itemssource="{binding logentries}"                            style="{staticresource logviewerstyle}">             <itemscontrol.template>                 <controltemplate>                     <scrollviewer cancontentscroll="true">                         <itemspresenter/>                     </scrollviewer>                 </controltemplate>             </itemscontrol.template>             <itemscontrol.itemspanel>                 <itemspaneltemplate>                     <virtualizingstackpanel isitemshost="true"/>                 </itemspaneltemplate>             </itemscontrol.itemspanel>         </itemscontrol>     </dockpanel> </usercontrol> 

where logviewerviewmodel

public class logviewerviewmodel : propertychangedbase {     private bindablecollection<logentry> logentries;      public logviewerviewmodel() { }     public logviewerviewmodel(ienumerable<logentry> logentries)     {         logentries = new bindablecollection<logentry>(logentries);     }      public bindablecollection<logentry> logentries     {         { return logentries; }         set         {             logentries = value;             notifyofpropertychange(() => logentries);         }     } } 

and in styles.xaml have

<resourcedictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"                     xmlns:caliburn="http://www.caliburnproject.org"                      xmlns:models="clr-namespace:gambitframework.utilities.models">     <style x:key="logviewerstyle" targettype="itemscontrol">         <setter property="template">             <setter.value>                 <controltemplate>                     <scrollviewer cancontentscroll="true">                         <itemspresenter/>                     </scrollviewer>                 </controltemplate>             </setter.value>         </setter>         <setter property="itemspanel">             <setter.value>                 <itemspaneltemplate>                     <virtualizingstackpanel isitemshost="true"/>                 </itemspaneltemplate>             </setter.value>         </setter>     </style>     <datatemplate datatype="{x:type models:logentry}">         <grid issharedsizescope="true">             <grid.columndefinitions>                 <columndefinition sharedsizegroup="timestamp" width="auto"/>                 <columndefinition sharedsizegroup="index" width="auto"/>                 <columndefinition sharedsizegroup="iconsource" width="auto"/>                 <columndefinition/>             </grid.columndefinitions>             <textblock text="{binding timestamp}"                         grid.column="0"                        fontweight="bold"                         margin="5,0,5,0"/>             <textblock text="{binding index}"                         grid.column="1"                        fontweight="bold"                         margin="0,0,2,0" />             <textblock text="{binding message}"                         grid.column="3"                        textwrapping="wrap"/>         </grid>     </datatemplate> </resourcedictionary> 

where model logentry is

public class logentry : propertychangedbase {     private uint index;     private datetime timestamp;     private iconpresentor iconsource;     private string message;      public uint index     {         { return index; }         set         {             index = value;             notifyofpropertychange(() => index);         }     }      public datetime timestamp     {         { return timestamp; }         set         {             timestamp = value;             notifyofpropertychange(() => timestamp);         }     }      public string message     {         { return message; }         set         {             message = value;             notifyofpropertychange(() => message);         }     } } 

but items not being displayed , when use snoop check bindings

cannot set expression. marked 'nonshareable' , has been used

which suggests datacontext not set correctly. doing wrong here , why datacontext not set control?

thanks time.


edit. here answer using same log control binding code behind, want bind separate file: https://stackoverflow.com/a/16745054/626442

you binding logviewerviewmodel datacontext of mainwindowview instead of datacontext of logviewerview

if want derive parent's datacontext, have @ similar questions like: how access parent's datacontext usercontrol

notice datatemplate bit special: https://stackoverflow.com/a/4480488


Comments