11
votes

Doit créer de la dépendencySource sur le même thread que la dépendanceObject

J'ai une application écrite dans WPF, qui télécharge des pages Web, analyse du code HTML et enregistre certaines valeurs.

<DataGrid Name="dataGrid" AutoGenerateColumns="False">
    <DataGrid.Columns>
         <DataGridTextColumn Header="Tag" Binding="{Binding Name}"/>
         <DataGridTextColumn Header="Color" Binding="{Binding MyClass.Percentage}">
             <!--<DataGridTextColumn.CellStyle>
                 <Style TargetType="DataGridCell">
                     <Setter Property="Background" Value="{Binding MyClass.Color}" />
                 </Style>
             </DataGridTextColumn.CellStyle>-->
         </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>


0 commentaires

3 Réponses :


2
votes

Je pense que la manière standard consiste à dériver l'objet de données de gelable et geler avant de le transmettre à un autre fil. Une fois que l'objet est gelé, vous ne pouvez plus le changer, il n'y a donc aucun danger de filetage de bugs.

Une autre option peut être de rendre l'objet de données un objet C # uni (non dérivé de DisternerObject ) et d'implémenter inotifypropertychanged vous-même.


1 commentaires

Les événements de l'état de propriété ne doivent pas nécessairement avoir lieu sur le fil de l'interface utilisateur, car ils sont [acheminés automatiquement au fil de l'UI. [ Stackoverflow.com/a/11015784]



36
votes

Le SolidColorBrush est un Freezable qui est une distribution dérivée. DispatcherObjects a une affinité de fil - c'est-à-dire que cela ne peut être utilisé / interagi que sur le fil sur lequel il a été créé. Les congélables offrent toutefois la capacité de geler une instance. Cela empêchera toute nouvelle modification de l'objet, mais elle libérera également l'affinité du fil. Vous pouvez donc la modifier afin que votre propriété ne stocke pas une dépendanceObject comme SolidColorBrush et stockez plutôt la couleur. Ou vous pouvez geler la solidcolorbrush que vous créez à l'aide du Freeze Méthode.


1 commentaires

Merci pour cette explication. La deuxième réponse à cette question est probablement de la même manière, mais je ne savais pas que je ne savais pas, quoi de geler. Maintenant, lorsque vous me l'avez dit, SolidColorbrush est dérivé de DispatcherObject et a expliqué la situation, je l'ai fait fonctionner. Merci encore, Bounty est votre.



2
votes

Ce n'est pas suffisant pour définir votre DataGrid.itemsSource sur le fil principal. Vous devez créer chaque élément sur le fil principal. Quelque chose comme: xxx


1 commentaires

C'est le seul détail que j'avais manqué! La tâche ne devrait récupérer que les données dont vous avez besoin, puis vous construisez votre collection observable avec elle.