Adjunto el diccionario observable del modelo de vista para ver. Yo uso Caliburn Micro Framework.Debe crear DependencySource en el mismo subproceso que el objeto DependencyObject
Vista:
<ListBox Name="Friends"
SelectedIndex="{Binding Path=SelectedFriendsIndex,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedItem="{Binding Path=SelectedFriend, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
Style="{DynamicResource friendsListStyle}"
IsTextSearchEnabled="True" TextSearch.TextPath="Value.Nick"
Grid.Row="2"
Margin="4,4,4,4"
PreviewMouseRightButtonUp="ListBox_PreviewMouseRightButtonUp"
PreviewMouseRightButtonDown="ListBox_PreviewMouseRightButtonDown"
MouseRightButtonDown="ListBox_MouseRightButtonDown"
Micro:Message.Attach="[MouseDoubleClick]=[Action OpenChatScreen()]" >
Código de la clase de vista del modelo.
Propiedades aspecto:
public MyObservableDictionary<string, UserInfo> Friends
{
get { return _friends; }
set
{
_friends = value;
NotifyOfPropertyChange(() => Friends);
}
}
En temporizador despachador me llaman cada 3 segundos en el método nuevo servicio hilo separado.
constructor Así que de vista del modelo tengo esto:
_dispatcherTimer = new DispatcherTimer();
_dispatcherTimer.Tick += DispatcherTimer_Tick;
_dispatcherTimer.Interval = TimeSpan.FromSeconds(3);
_dispatcherTimer.Start();
_threadDispatcher = Dispatcher.CurrentDispatcher;
y el método de paso del temporizador está aquí:
private void DispatcherTimer_Tick(object sender, EventArgs eventArgs)
{
new System.Threading.Tasks.Task(() =>
{
//get new data from server
MyObservableDictionary<string, UserInfo> freshFriends = _service.GetFriends(Account);
_threadDispatcher.BeginInvoke((System.Action)(() =>
{
//clear data, Friend is property which is binded on listobox control
Friends.Clear();
//here is problem - > refresh data
foreach (var freshFriend in freshFriends)
{
Friends.Add(freshFriend);
}
}));
}).Start();
cuando corro aplicación me sale este error:
Must create DependencySource on same Thread as the DependencyObject.
at System.Windows.Markup.XamlReader.RewrapException(Exception e, Uri baseUri)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlReader templateReader, XamlObjectWriter currentWriter)
at System.Windows.FrameworkTemplate.LoadTemplateXaml(XamlObjectWriter objectWriter)
at System.Windows.FrameworkTemplate.LoadOptimizedTemplateContent(DependencyObject container, IComponentConnector componentConnector, IStyleConnector styleConnector, List`1 affectedChildren, UncommonField`1 templatedNonFeChildrenField)
at System.Windows.FrameworkTemplate.LoadContent(DependencyObject container, List`1 affectedChildren)
at System.Windows.StyleHelper.ApplyTemplateContent(UncommonField`1 dataField, DependencyObject container, FrameworkElementFactory templateRoot, Int32 lastChildIndex, HybridDictionary childIndexFromChildID, FrameworkTemplate frameworkTemplate)
at System.Windows.FrameworkTemplate.ApplyTemplateContent(UncommonField`1 templateDataField, FrameworkElement container)
at System.Windows.FrameworkElement.ApplyTemplate()
at System.Windows.FrameworkElement.MeasureCore(Size availableSize)
at System.Windows.UIElement.Measure(Size availableSize)
at System.Windows.Controls.Border.MeasureOverride(Size constraint)
Intento reemplazar despachador:
este _threadDispatcher = Dispatcher.CurrentDispatcher;
con esto: _threadDispatcher = Application.Current.Dispatcher;
Pero no ayuda. Gracias por el consejo.
MyObservableDicionary no es dependencia de los objetos o tienen la propiedad dependecy:
public class MyObservableDictionary<TKey, TValue> :
IDictionary<TKey, TValue>,
INotifyCollectionChanged,
INotifyPropertyChanged
{..}
¿Qué quiere decir con la fuente de datos? ¿Amigo de la propiedad? –
Su modelo de vista, o cualquier cosa que esté vinculada a la interfaz de usuario. – Botz3000
No, VM es crear con Caliburn Micro, en esta clase no tengo propiedades ni objetos de dependencia. –