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
Post a Comment