2010-04-22 5 views
0

Je souhaite lier le texte du bloc de texte dans WPF DataGrid à une propriété de dépendance. D'une manière ou d'une autre, rien n'est affiché, mais quand j'utilise la même liaison de texte à l'extérieur de la grille, tout fonctionne bien. Voici mon code,Propriété de dépendance Grille WPF

 </Grid.RowDefinitions> 

     <StackPanel Grid.Row="0"> 
      <toolkit:DataGrid Name="definitionGrid" Margin="0,10,0,0" AutoGenerateColumns="False" 
               CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="False" 
               RowHeight="25" FontWeight="Normal" ItemsSource="{Binding Subscription}" 
               ColumnHeaderStyle="{DynamicResource ColumnHeaderStyle}" 
               SelectionMode="Single" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Width="450" 
           ScrollViewer.VerticalScrollBarVisibility="Auto" Height="200">   
        <toolkit:DataGridCheckBoxColumn Header="Email" Width="60" Binding="{Binding ReceivesEmail}" CellStyle="{StaticResource cellCenterAlign}"/> 

        <toolkit:DataGridTemplateColumn Header="Others" Width="220" CellStyle="{StaticResource cellCenterAlign}" IsReadOnly="True"> 
         <toolkit:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Path=OtherSubs}"/> 
          </DataTemplate> 
         </toolkit:DataGridTemplateColumn.CellTemplate> 
        </toolkit:DataGridTemplateColumn> 
       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 
      <TextBlock Text="{Binding Path=OtherSubs}"/> 
     </StackPanel> 

code-behind

public string OtherSubs 
{ 
    get { return (string)GetValue(OtherSubsProperty); } 
    set { SetValue(OtherSubsProperty, value); } 
} 
public static readonly DependencyProperty OtherSubsProperty = DependencyProperty.Register("OtherSubs", typeof(string), 
    typeof(ProgramSubscriptions), new UIPropertyMetadata(string.Empty)); 

     //other.... 
     for (int i = 0; i < OtherPrgList.Count; i++) 
     { 
      foreach (int y in myList) 
      { 
       ProgramSubscriptionViewModel otheritem = OtherPrgList[i]; 
       if (y == otheritem.Program.ID) 
        OtherSubs += otheritem.Subscriber.Username + ", "; 
      } 
     } 

S'il vous plaît ne laissez-moi savoir s'il y a une autre façon que je peux faire ce travail, au lieu d'utiliser un DependencyProperty, althouht pour le test je l'ai fait mettre un bloc de texte sous dataagrid, et cela fonctionne parfaitement bien .. Aide!

+0

Je suppose que OtherSubs fait partie d'une classe qui est dans une collection, et que la ItemsSource du DataGrid est définie sur cette collection? –

Répondre

2

Votre propriété Abonnement doit être une collection de ProgramSubscriptions objets. Il doit supporter au moins l'interface IEnumerable. Normalement, vous auriez quelque chose comme Liste <ProgramSubscriptions>. En outre, OtherSubs est évidemment une propriété sur ProgramSubscriptions et c'est ok.

Pouvez-vous montrer comment vous utilisez "la même reliure de texte à l'extérieur de la grille"?

+0

En dehors de la grille, j'utilise le code ci-dessous, et cela fonctionne. Pourriez-vous s'il vous plaît me montrer le code pour ce qui précède qui fonctionnerait, je suis assez nouveau à WPF et je ne suis pas sûr de savoir comment le faire .. – developer

+0

Ma propriété d'abonnement est une obsrvablecollection de l'objet ProgramSubscriptions..S'il vous plaît aider .. – developer

+0

Eh bien, c'est un peu confus. Si le TextBlock ci-dessus fonctionne côte à côte avec le DataGrid, il apparaît alors que le DataContext parent de TextBlock et de DataGrid est lié à une instance de ProgramSubscriptions et que ItemsSource = "{Subscription de liaison}" ne peut pas fonctionner. Laquelle de vos classes implémente la propriété d'abonnement? Pouvez-vous jeter un coup d'œil à la fenêtre de débogage? S'il y a des erreurs de liaison, elles doivent être enregistrées là. Si vous ne pouvez pas les déchiffrer vous-même, postez-les ici. – wpfwannabe

0

Vous liez le DataGrid à l'abonnement. Cela devrait être une propriété sur le DataContext de DataGrid. Comme wpfwannabe l'a dit, il devrait supporter IEnumerable. Idéalement, vous auriez un ObservableCollection<> ou dérivé, de sorte que le DataGrid se met à jour automatiquement.

À partir de là, le DataGrid obtiendra les éléments qu'il devrait afficher. Pour afficher les données réelles, vous avez votre définition DataGridTemplateColumn. Puisque vous vous connectez à OtherSubs, cela signifie que les objets énumérés par votre abonnement IEnumerable devraient avoir cette propriété. BTW il n'a pas besoin d'être une propriété de dépendance pour que cela fonctionne.

+0

La propriété Abonnement est une collection Observable d'objets .. – developer

+0

Votre problème est probablement un "bug" de WPF Voir http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext- à son- columns.aspx –

Questions connexes