2010-03-12 7 views
13

Mam nadzieję, że to nie jest dupe.Bind Grid.Row/Grid.Column inside DataTemplate

Chciałbym być w stanie wykonać następujące czynności w XAML: Prace

<DataTemplate DataType="{x:Type TestApp:ButtonVM}">   
     <Button 
       Grid.Column="{Binding GridColumn}" 
       Grid.Row="{Binding GridRow}" 
       Content="{Binding Path=Info}" 
     /> 
</DataTemplate> 

zawartości wiążące drobne ale Grid.Column i Grid.Row po prostu nie istnieje w produkowanego przedmiotu. Nawet wtedy, gdy ustawiam je na jakąś wartość bez wiązania (jak w Grid.Column = "1"). Sprawdziłem aplikację i zobaczyłem, że w mojej sieci nikt nigdy nie tworzy Grid.Column and Grid.Row.

Wszelkie pomysły?

+0

Jak się masz swoje obiekty ButtonVM do sieci? Grid nie jest kontrolką elementów, więc nie bierze arbitralnych obiektów widoku jako obiektów potomnych. –

+0

Zobacz poniżej, udało mi się zrobić to sam. Sekretem jest użycie ItemsControl.ItemContainerStyle i użycie Setterów do wstrzyknięcia wiązania do szablonowego potomka. – Thorsten79

Odpowiedz

18

Rozwiązałem to sam z pomocą blogów.

O ile rozumiem, po prostu nie można wykonać załączonej właściwości wiążącej wewnątrz.

Poniższa rozwiązuje problem w jednej chwili (ItemContainerStyle!):

<DataTemplate DataType="{x:Type TestApp:GridVM}"> 
     <ItemsControl ItemsSource="{Binding Path=Children}"> 
      <ItemsControl.ItemContainerStyle> 
       <Style> 
        <Setter Property="Grid.Row" Value="{Binding GridRow}" /> 
        <Setter Property="Grid.Column" Value="{Binding GridColumn}" /> 
       </Style> 
      </ItemsControl.ItemContainerStyle> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <Grid ShowGridLines="True" Style="{Binding Path=Style}"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height=".5*" /> 
          <RowDefinition Height=".5*" />        
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width=".5*" /> 
          <ColumnDefinition Width=".5*" /> 
         </Grid.ColumnDefinitions>       
        </Grid> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
</DataTemplate> 
+1

Ah tak. Że należy to zrobić. Załączony Grid.Row musi być bezpośrednim dzieckiem siatki. –

+0

Mieliśmy wiele problemów i próbowaliśmy wielu innych rozwiązań i to było jedyne, które działało !!! – Garvice