Ich habe zwei Klassenbeobachtbare Sammlung Änderung wird nicht von Hintergrund auf UI aktualisiert, aber eine normale Eigenschaft erhält Benachrichtigung
public class ConccClass<T> : ObservableCollection<T>
{
}
und
public class TestTherad: INotifyPropertyChanged
{
private string name;
public string Name
{ get {
return name;
}
set
{
if (value != name)
{
name = value;
RaisePropertyChanged("Name");
}
}
}
//// the notification implemented fully here
}
Jetzt habe ich eine Sammlung von ‚ConccClass‘ erstellt haben, in meiner Ansicht Modell und binde es mit Datagrid auf XAML in Sicht.
Frage Wenn ich ein Element auf einem Hintergrund-Thread einfach ohne irgendeinen Dispatcher hinzufügen, spiegelt es sich nicht in Datagrid wider. bedeutet, dass kein Gegenstand hinzugefügt wurde. Dazu muss ich den Artikel im Dispatcher hinzufügen. Beginne Invoke. Was für mich Sinn macht.
Aber um den Namen eines Artikels zu aktualisieren, brauche ich keinen Dispatcher.
Task.Factory.StartNew(() =>
{
while (true)
{
Thread.Sleep(100);
{
this.Dispatcher.Invoke(() => this.Coll.Add(new TestTherad())); // **Works well**
//this.Coll.Add(new TestTherad()); // **does not work at all.**
this.Coll[0].Name = r.Next().ToString(); // ** without dispatcher works well.**
}
}
});
Warum solch ein Verhalten?
Welche Version von .Net? – OmegaMan
Mit dotPeek, in 'INotifyPropertyChanged' gibt es' Ereignis PropertyChangedEventHandler PropertyChanged; '. Ein Blick auf 'PropertyChangedEventHandler' zeigt, dass es sich um einen Delegaten mit dem folgenden Attribut' [HostProtection (SecurityAction.LinkDemand, SharedState = true)]] handelt. Ich frage mich, ob [SharedState] (http://msdn.microsoft.com/en-us/library/system.security.permissions.hostprotectionattribute.sharedstate (v = vs.110) .aspx) ermöglicht den Delegaten erfolgreich ausgeführt werden der Haupt-Thread, ohne dass er aufgerufen werden muss. –
@OmegaMan - es ist VS 2012. –